C# 实体框架-代码优先-数据注释-不必要的外键列
实体框架正在my AccountCompanyRole表中创建两个不必要的列 会计公司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;
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关系添加流畅的配置(请参见更新后的答案)谢谢,就是这样:)