EF 4.1映射问题

Ubi*_*MNJ 7 entity-framework code-first entity-framework-4.1

我有一个与自己有关系的班级:

public class Person
{
    public long ID { get; set; }
    public string Name { get; set; }

    public virtual Person Mother { get; set; }
    public virtual Person Father { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

当EF 4.1试图映射这个类时,我得到了以下错误:'无法确定类型'Model.Person'和'Model.person'之间关联的主要结束.必须使用关系流畅API或数据注释显式配置此关联的主要结尾.

我已经尝试了EF 4.1主题- 模型关系的解决方案,但没有成功.

我怎么解决这个问题?

谢谢!

Sla*_*uma 9

因为它自然是一对多的关系(一个人必须有一个父亲和一个母亲,但可以有许多儿子和女儿)我会像这样建模:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .HasRequired(p => p.Father)
        .WithMany();

    modelBuilder.Entity<Person>()
        .HasRequired(p => p.Mother)
        .WithMany();
}
Run Code Online (Sandbox Code Playgroud)

这将在数​​据库表中创建两个必需的外键,其名称Mother_IDFather_ID约定.

编辑

如果您希望能够创建没有母亲和父亲的人,您可以将关系设为可选而非必需:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .HasOptional(p => p.Father)
        .WithMany();

    modelBuilder.Entity<Person>()
        .HasOptional(p => p.Mother)
        .WithMany();
}
Run Code Online (Sandbox Code Playgroud)

然后数据库表中的外键可以为空.

如果您不喜欢外键(Mother_IDFather_ID)的默认列名,则可以自定义映射中的列名:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .HasOptional(p => p.Father)
        .WithMany()
        .Map(m => m.MapKey("FatherID"));

    modelBuilder.Entity<Person>()
        .HasOptional(p => p.Mother)
        .WithMany()
        .Map(m => m.MapKey("MotherID"));
}
Run Code Online (Sandbox Code Playgroud)