如何解决实体框架4.1代码优先外键ID
| 我有两个实体被一对多引用。当实体框架创建表时,它将创建两个外键,一个用于我通过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);
}
谢谢!
解决方法
您必须明确指定关联的多端:
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany(d => d.People)
.HasForeignKey(p => p.DepartmentId)
.WillCascadeOnDelete(false);
否则,EF将假定存在两个关联:一个在which2ѭ中没有公开键,foreign3ѭ和导航属性Department
在Person
类中未公开,而另一个关联属于公开的导航属性you6ѭ。但是另一个未暴露的末尾在ѭ5中,并且由EF自动创建一个外键。那是您在数据库中看到的另一个键。
,缺省的Code First约定可以检测到DepartmentId外键,因为它很常规。我认为您应该删除Fluent定义:
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany()
.WillCascadeOnDelete(false);
,最好的办法是从Person类中删除departmentid属性,并添加以下语句。 MapKey将使用您指定的名称创建外键列
modelBuilder.Entity<Person>().HasRequired(p => p.Department)
.WithMany().Map(x=>x.MapKey(\"DepartmentId\"))
.WillCascadeOnDelete(false);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。