我有两个一对多引用的实体。当实体框架创建表时,它创建了两个外键,一个用于我用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);
}
谢谢!
发布于 2011-04-14 06:58:09
您必须显式指定关联的多端:
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany(d => d.People)
.HasForeignKey(p => p.DepartmentId)
.WillCascadeOnDelete(false);
否则,EF将假设有两个关联:一个没有在Department
中公开,正如您在Fluent代码中定义的那样,在Person
类中具有外键DepartmentId
和导航属性Department
-另一个关联属于公开的导航属性People
,但在Person
中与另一个未公开的端以及EF自动创建的外键相关联。这是您在数据库中看到的另一个键。
发布于 2011-04-14 06:04:43
默认的Code First约定检测您的DepartmentId外键,因为它是常规的。我认为你应该去掉流畅的定义:
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany()
.WillCascadeOnDelete(false);
发布于 2012-12-18 16:32:29
最好的方法是从Person类中删除departmentid属性,并添加以下语句。MapKey将使用您指定的名称创建外键列
modelBuilder.Entity<Person>().HasRequired(p => p.Department)
.WithMany().Map(x=>x.MapKey("DepartmentId"))
.WillCascadeOnDelete(false);
https://stackoverflow.com/questions/5656159
复制相似问题