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
暴露,一个是外键DepartmentId
和Person
类中的导航属性Department
,如你在Fluent代码中定义的那样 – 另一个属于暴露导航属性的关联People
但是另一个没有暴露的Person
在Person
和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);