entity framework4.1代码第一外键ID

我有两个实体引用了一对多。 当entity framework创建表时,它创建两个外键,一个用于我用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 People { get; set; } } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(p => p.Department) .WithMany() .HasForeignKey(p => p.DepartmentId) .WillCascadeOnDelete(false); } 

谢谢!

您必须明确指定关联的多端:

 modelBuilder.Entity() .HasRequired(p => p.Department) .WithMany(d => d.People) .HasForeignKey(p => p.DepartmentId) .WillCascadeOnDelete(false); 

否则,EF将假定有两个关联:一个没有在Department暴露,一个是外键DepartmentIdPerson类中的导航属性Department ,如你在Fluent代码中定义的那样 – 另一个属于暴露导航属性的关联People但是另一个没有暴露的PersonPerson和EF自动创建的外键。 这是您在数据库中看到的另一个键。

默认的Code First约定检测您的DepartmentId外键,因为它是传统的。 我认为你应该删除Fluent定义:

 modelBuilder.Entity() .HasRequired(p => p.Department) .WithMany() .WillCascadeOnDelete(false); 

最好的方法是从Person类中删除departmentid属性并添加以下语句。 MapKey将使用您指定的名称创建外键列

  modelBuilder.Entity().HasRequired(p => p.Department) .WithMany().Map(x=>x.MapKey("DepartmentId")) .WillCascadeOnDelete(false);