EF 6映射复杂复合键

时间:2017-05-24 20:46:07

标签: frameworks entity-framework-6 key entity composite

我有以下型号

public class Company
{
    [Key, Column(Order=0)]
    public int Id {get;set;}
    public string CompanyCode { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Account> Accounts { get; set; }
    public virtual ICollection<Journal> Journals { get; set; }

}

public class Account
{
    [Key, Column(Order=0)]
    public int Id { get; set; }

    [Key, Column(Order=1), ForeignKey("Company")]
    public int CompanyId { get; set; }

    public int GLAccountNumber { get; set; }
    public decimal Balance { get; set; }

    public virtual Company Company { get; set; }
    public virtual ICollection<Journal> Journals { get; set; }
}

public class Journal
{
    [Key, Column(Order=0)]
    public int Id { get; set; }

    [Key, Column(Order=1), ForeignKey("Company")]
    public int CompanyId { get; set; }

    [ForeignKey("Account")]
    public int AccountId { get; set; }

    public DateTime EntryDate { get; set; }
    public decimal Amount { get; set; }

    public virtual Company Company { get; set; }
    public virtual Account Account { get; set; }
}

我如何映射这些模型之间的关系,具体来说,我无法弄清楚如何在Journal Model中定义Composite Key以映射到Account By CompanyId,AccountId

1 个答案:

答案 0 :(得分:1)

你可以使用流利的APi(我的个人偏好 - 明确且不易出错):

modelBuilder.Entity<Journal>()
    .HasRequired(e => e.Account)
    .WithMany(e => e.Journals)
    .HasForeignKey(e => new { e.AccountId, e.CompanyId });

但是如果您更喜欢数据注释,那么在导航属性上应用ForeignKey属性并指定FK属性的逗号分隔列表:

public class Journal
{
    [Key, Column(Order=0)]
    public int Id { get; set; }

    [Key, Column(Order=1)]
    public int CompanyId { get; set; }

    public int AccountId { get; set; }

    public DateTime EntryDate { get; set; }
    public decimal Amount { get; set; }

    [ForeignKey("CompanyId")]
    public virtual Company Company { get; set; }

    [ForeignKey("AccountId,CompanyId")]
    public virtual Account Account { get; set; }
}