实体框架中的自引用/父子关系

Posted

技术标签:

【中文标题】实体框架中的自引用/父子关系【英文标题】:Self referencing / parent-child relationship in Entity Framework 【发布时间】:2012-04-14 21:03:32 【问题描述】:

我阅读了很多程序员的帖子,这些帖子遇​​到了 无法确定相关操作的有效顺序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系 - 在 Entity Framework 中使用自引用关系时例外。

我正在尝试建立亲子关系:

public class Category 
    public int CategoryId  get; set; 
    public string Name  get; set; 
    public int ParentId  get; set; 
    public Category Parent  get; set; 
    public List<Category> Children  get; set; 

这是我使用的配置(Fluent API):

Property(c => c.ParentId).IsOptional();
HasMany(c => c.Children).WithOptional(c => c.Parent).HasForeignKey(c => c.ParentId);
//HasOptional(c => c.Parent).WithMany(c => c.Children).HasForeignKey(c => c.ParentId);

当我尝试保存这样的新类别时,HasMany() 和 HasOptional() 配置都会导致“无法确定相关操作的有效排序...”异常:

context.Categories.Add(new Category  Name = "test" );

我不明白为什么 EF 不插入具有空 parentId 的类别。数据库允许 ParentId 外键为空。

你能告诉我怎么做吗?

【问题讨论】:

【参考方案1】:

您必须将类别类中的ParentId 定义为可为空,才能将其用作可选 关系的外键属性:

public int? ParentId  get; set; 

int 属性不能采用值 null,因此不能将 NULL 表示为数据库列中的值。

【讨论】:

有没有办法实现这种带属性的父子关系(流畅)?

以上是关于实体框架中的自引用/父子关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在维度模式中建模父子关系表

高效开发:Spring和SpringMVC的父子关系

高效开发:Spring和SpringMVC的父子关系

csharp 父子相关的自引用表数据绑定在一起并相应地排序(使用递归调用).cs

如何避免父子jpa关系中的json响应递归?

工作单元模式 - 管理父子关系