实体框架代码优先中的多个自引用属性

时间:2016-01-20 10:57:08

标签: c# entity-framework code-first

我有一个包含两个导航属性的类。

public class Entity
{
    public int Id { get; set; }    
    public Entity Parent { get; set; }    
    public Entity BaseEntity { get; set; }
}

当我运行应用程序时,EF抛出一个说明的说明 “无法确定类型'Test.Entity'和'Test.Entity'之间关联的主要结束。必须使用关系流畅的API或数据注释显式配置此关联的主要结尾。”。

据我所知,当定义一对一关系并且没有为EF提供正确确定关系两侧的提示时,会引发此异常。

现在我有两个问题。

首先,为什么会在此处引发此异常? EF是否会以某种方式将此场景视为一对一的关系?

其次,如何使用属性解决这个问题? 我知道以下Fluent API代码解决了这个问题,但我对属性感觉更舒服。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Entity>().HasOptional(e => e.Parent).WithOptionalDependent();
    modelBuilder.Entity<Entity>().HasOptional(e => e.BaseEntity).WithOptionalDependent();
}

1 个答案:

答案 0 :(得分:1)

我在MSDN上找到了我的问题的答案。

https://social.msdn.microsoft.com/Forums/en-US/08bba96a-20b2-4a3c-9e0e-a5475b703dfe/code-first-self-referencing-foreign-key?forum=adodotnetentityframework

根据批准的答案(由Rowan Miller撰写),以下代码正确描述了这种关系(而不是我的代码)。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{         
    modelBuilder.Entity<AssetType>().HasOptional(a => a.parent).WithMany();
    modelBuilder.Entity<AssetType>().HasOptional(a => a.baseAssetType).WithMany();
}