一对零/一关系(代码优先)

Joa*_*oao 5 mapping entity-framework entity-framework-4.1

我正在尝试这堂课:

public class Person
{
    public int PersonID { get; set; }
    public string Name { get; set; }
    public int SpouseID { get; set; }
    public virtual Person Spouse { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

关系是:一个人有一个或零个配偶/一个配偶有一个必需的人

是否可以在Fluent API中构建此模型?

谢谢.

Lad*_*nka 6

遗憾的是,由于目前EF不支持唯一密钥,因此无法进行真正的自引用一对一关系.要使这种真实的自我引用一对一SpouseID必须标记为唯一.EF仅允许主键一对一(依赖实体中的主键必须也是主体实体的外键),这意味着自引用一对一关系将以PersonID <-> PersonID=两个PersonID在单个表中具有相同的实体结束.这是不可能的,因为它是PersonID主键,它必须是唯一的.

您可以将其作为一对多处理,并且只公开单个导航属性,如您所知:

modelBuilder.Entity<Person>()
            .HasOptional(p => p.Spouse)
            .WithMany()
            .HasForeingKey(s => s.SpouseID);
Run Code Online (Sandbox Code Playgroud)

要在数据库中强制实施一对一关系,您将添加自定义数据库初始化程序并在SpouseID列上手动创建唯一索引.

问题是它只是单向导航,所以你可以得到人的配偶,但从那里Spouse你不能回到丈夫.