簡體   English   中英

實體框架 - 代碼優先 - 數據注釋 - 不必要的外鍵列

[英]Entity Framework - Code first - Data annotations - Unnecessary foreign key columns

實體框架在我的AccountCompanyRole表中創建了兩個不必要的列。

AccountCompany

public class AccountCompany
{
    [Key, Column(Order = 0), ForeignKey("Account")]
    public int AccountID { get; set; }

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

    public virtual Account Account { get; set; }

    public virtual Company Company { get; set; }

    public virtual ICollection<AccountCompanyRole> AccountCompanyRoles { get; set; }
}

AccountCompanyRoles

public class AccountCompanyRole
{
    [Key, Column(Order = 0), ForeignKey("AccountCompany")]
    public int AccountID { get; set; }

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

    [Key, Column(Order = 2), ForeignKey("Role")]
    public int RoleID { get; set; }

    public virtual AccountCompany AccountCompany { get; set; }

    public virtual Role Role { get; set; }
}

OnModelCreating

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AccountCompanyRole>()
            .HasRequired(p => p.AccountCompany)
            .WithMany()
            .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

DB中的結果

DB中的結果

如您所見,EF在AccountCompanyRoles中添加了兩個額外的外鍵,即使我在Data Annotations中指定了主鍵和外鍵。

問題

  1. 如何阻止它創建AccountCompany_AccountID和AccountCompany_CompanyID?

  2. 這是我追求的最佳結構嗎? 我應該使用一個主鍵並將IsUnique索引放在AccountID和CompanyID上嗎? 這可能會解決我的問題..

如何阻止它創建AccountCompany_AccountID和AccountCompany_CompanyID?

首先,從CompanyIDRoleID刪除ForeignKey屬性。

然后將ForeignKey屬性放在AccountCompany成員上,如下所示:

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

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

    [Key, Column(Order = 2), ForeignKey("Role")]
    public int RoleID { get; set; }

    [ForeignKey("AccountID, CompanyID")]
    public virtual AccountCompany AccountCompany { get; set; }

    public virtual Role Role { get; set; }
}

或者像這樣使用流暢的配置:

modelBuilder.Entity<AccountCompanyRole>()
            .HasRequired(r => r.AccountCompany)
            .WithMany(c => c.AccountCompanyRoles)
            .HasForeignKey(r => new { r.AccountID, r.CompanyID })
            .WillCascadeOnDelete(false);

這是我追求的最佳結構嗎? 我應該使用一個主鍵並將IsUnique索引放在AccountID和CompanyID上嗎? 這可能會解決我的問題..

IMO都是有效的方法,使用最適合您需求的方法。

您必須在流暢的關系中指定外鍵,如下所示:

modelBuilder.Entity<AccountCompanyRole>()
            .HasRequired(p => p.AccountCompany)
            .WithMany().HasForeignKey(d => new { d.AccountID, d.CompanyID })
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<AccountCompany>()
            .HasMany(c => c.AccountCompanyRoles)
            .WithRequired(d => d.AccountCompany)
            .HasForeignKey(e => new {e.AccountID, e.CompanyID});

編輯:為AccountCompany添加了流暢的配置

暫無
暫無

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

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