我有两个实体引用了一对多。当实体框架创建表时,它会创建两个外键,一个用于我用Fluent接口指定的键,另一个用于ICollection。如何摆脱重复的外键?
public class Person
{
public long RecordId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Username { get; set; }
public long DepartmentId { get; set; }
public virtual Department Department { get; set; }
}
public class Department
{
public long RecordId { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> People { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany()
.HasForeignKey(p => p.DepartmentId)
.WillCascadeOnDelete(false);
}
谢谢!
答案 0 :(得分:26)
您必须明确指定关联的多端:
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany(d => d.People)
.HasForeignKey(p => p.DepartmentId)
.WillCascadeOnDelete(false);
否则EF将假定有两个关联:Department
中没有公开的关联,DepartmentId
类中的外键Department
和导航属性Person
您已经在Fluent代码中定义了 - 另一个属于公开导航属性People
的关联,但是Person
中的另一个未公开的结尾和EF自动创建的外键。这是你在数据库中看到的另一个关键。
答案 1 :(得分:6)
默认的Code First约定会检测您的DepartmentId外键,因为它是传统的。我认为你应该删除Fluent定义:
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany()
.WillCascadeOnDelete(false);
答案 2 :(得分:3)
最好的方法是从Person类中删除departmentid属性并添加以下语句。 MapKey将使用您指定的名称
创建外键列 modelBuilder.Entity<Person>().HasRequired(p => p.Department)
.WithMany().Map(x=>x.MapKey("DepartmentId"))
.WillCascadeOnDelete(false);