实体框架4.1代码第一外键ID

时间:2011-04-13 21:54:45

标签: c# poco entity-framework-4.1

我有两个实体引用了一对多。当实体框架创建表时,它会创建两个外键,一个用于我用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);
}

谢谢!

3 个答案:

答案 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);