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

本文关键字:自引用 属性 框架 代码 实体 | 更新日期: 2023-09-27 18:31:17

我有一个类,其中包含两个自身的导航属性。

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();
}

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

我在 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();
}