C# 实体框架-代码优先-数据注释-不必要的外键列

C# 实体框架-代码优先-数据注释-不必要的外键列,c#,asp.net,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net,Asp.net Mvc,Entity Framework,Entity Framework 6,实体框架正在my AccountCompanyRole表中创建两个不必要的列 会计公司 public class AccountCompany { [Key, Column(Order = 0), ForeignKey("Account")] public int AccountID { get; set; } [Key, Column(Order = 1), ForeignKey("Company")] public int CompanyID { get;

实体框架正在my AccountCompanyRole表中创建两个不必要的列

会计公司

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; }
}
关于模型创建

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

        base.OnModelCreating(modelBuilder);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity

如您所见,EF在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; }
}
  • 如何防止它创建AccountCompany\u AccountID和AccountCompanyId

  • 这是我所追求的最好的结构吗?我应该使用一个primarykey并将IsUnique索引放在AccountID和CompanyID上吗?这可能会解决我的问题

  • 如何防止它创建AccountCompany\u AccountID和AccountCompanyId

    首先,从
    CompanyID
    RoleID
    中删除
    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);
    
    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});
    
    或者使用如下流畅的配置:

    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);
    
    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});
    
    modelBuilder.Entity()
    .HasRequired(r=>r.AccountCompany)
    .WithMany(c=>c.AccountCompanyRoles)
    .HasForeignKey(r=>new{r.AccountID,r.CompanyID})
    .WillCascadeOnDelete(假);
    
    这是我所追求的最好的结构吗?我应该使用一个primarykey并将IsUnique索引放在AccountID和CompanyID上吗?这可能会解决我的问题


    在我看来,这两种方法都是有效的,请使用更适合您需要的方法。

    您必须在流畅的关系中指定外键,如下所示:

    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);
    
    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});
    
    modelBuilder.Entity()
    .HasRequired(p=>p.AccountCompany)
    .WithMany().HasForeignKey(d=>new{d.AccountID,d.CompanyID})
    .WillCascadeOnDelete(假);
    modelBuilder.Entity()
    .HasMany(c=>c.AccountCompanyRoles)
    .WithRequired(d=>d.AccountCompany)
    .HasForeignKey(e=>new{e.AccountID,e.CompanyID});
    
    编辑:
    为AccountCompany添加了fluent配置

    Hi!我尝试了你对数据注释和fluent API的建议,但我的AccountCompanyRole表中仍然有两列额外的内容。我甚至删除了DB/迁移并重新创建了我的DB,但这也没用。我还必须为AccountCompany添加fluent配置。不过,我在这样的细节上投了你的赞成票引导回答。Thanks@Reft不客气。很高兴您的问题已经解决。但是“解决方案”有味道。配置一个和相同的关系两次没有意义。我在EF环境中检查过,问题是
    with many()
    call,应该与更新后的答案相同。我的AccountCompanyRole表中还有两列额外的内容。我甚至删除了DB/Migrations并重新创建了我的DB,但这也没有帮助。请尝试为您的AccountCompany关系添加流畅的配置(请参见更新后的答案)谢谢,就是这样:)