簡體   English   中英

實體框架Fluent API映射問題

[英]Entity Framework Fluent API Mapping Issue

如何配置三個表之間的關系以獲取所有相關數據?

我有以下模型(和數據庫中的相同表):

public class Client 
{
  public Guid ClientId { get; set; }
  public string FirstName { get; set; }

  public virtual ClientCard ClientCard { get; set; }
}

public class Card
{
  public Guid CardId { get; set; }
  public string Number { get; set; }

  public virtual ClientCard ClientCard { get; set; }
}

public class ClientCard
{
  public Guid ClientCardId { get; set; }
  public Guid CardId { get; set; }
  public Guid ClientId { get; set; }

  public virtual Client Client { get; set; }
  public virtual Card Card { get; set; }
}

以及以下OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Conventions.Remove<PluralizingTableNameConvention>();

        ...

        builder.Entity<ClientCard>()
            .HasKey(x => x.ClientCardId);

        builder.Entity<ClientCard>()
            .HasRequired(x => x.Client)
            .WithRequiredPrincipal(x => x.ClientCard);

        builder.Entity<ClientCard>()
            .HasRequired(x => x.Card)
            .WithRequiredPrincipal(x => x.ClientCard);

        base.OnModelCreating(builder);
    }

但是結果返回時沒有相關數據。 為什么?

對於您的代碼,請嘗試以下操作:

public class Client 
{
  public Guid ClientId { get; set; }
  public string FirstName { get; set; }

  public virtual ICollection<ClientCard> ClientCard { get; set; }
}

public class Card
{
  public Guid CardId { get; set; }
  public string Number { get; set; }

  public virtual ICollection<ClientCard> ClientCard { get; set; }
}

public class ClientCard
{
  public Guid ClientCardId { get; set; }
  public Guid CardId { get; set; }
  public Guid ClientId { get; set; }

  public virtual Client Client { get; set; }
  public virtual Card Card { get; set; }
}

並映射:

    builder.Entity<Client>()
           .HasKey(t => t.ClinetID);
    ....
    builder.Entity<Client>()
           .HasMany(a => a.ClientCard)
           .WithRequired(p => p.Client)
           .HasForeignKey(p => p.ClientID);

對於卡

    ....
    builder.Entity<Card>()
           .HasMany(a => a.ClientCard)
           .WithRequired(p => p.Card)
           .HasForeignKey(p => p.CardID);

但我認為最好的方法是為每個實體創建一個單獨的映射文件

現在,我使用以下模型:

public class Client 
{
   public Guid ClientId { get; set; }
   public string FirstName { get; set; }

   public Guid? CardId { get; set; }
   public virtual Card Card { get; set; }
}

public class Card
{
   public Guid CardId { get; set; }
   public string Number { get; set; }

   //public virtual Client Client { get; set; }
}

和以下OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder builder)
{
        builder.Conventions.Remove<PluralizingTableNameConvention>();

        ... 

        builder.Entity<Client>()
            .HasOptional(x => x.Card)
            //.WithOptionalPrincipal(x=> x.Client) 
            //or
            //.WithOptionalDependent(x=> x.Client)
            ;

        base.OnModelCreating(builder);
}

所有客戶均返回相關數據(如果存在)。 但是,如果我想使用Card對象獲取相關數據並且取消注釋public virtual Client Client { get; set; } public virtual Client Client { get; set; } public virtual Client Client { get; set; }和WithOptionalPrincipal / WithOptionalDependent,我總是了解這些SqlException:“無效的列名'Client_ClientId'”(如果使用了WithOptionalPrincipal)或“無效的列名'Card_CardId'”(如果使用了WithOptionalDependent)

我終於找到了解決方案。

首先,我從Client類中刪除了CardId。 其次,我更改了OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Conventions.Remove<PluralizingTableNameConvention>();

        ...

        builder.Entity<Client>()
            .HasOptional(x => x.Card)
            .WithOptionalDependent(x => x.Client)
            .Map(x => x.MapKey("CardId"))
            .WillCascadeOnDelete(false);

        builder.Entity<Card>()
            .HasOptional(x => x.Client)
            .WithOptionalPrincipal(x => x.Card)
            .WillCascadeOnDelete(false);

        base.OnModelCreating(builder);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM