一对多和递归关系 - 要设置的强制值

时间:2014-08-03 13:43:06

标签: c# entity-framework ef-code-first .net-4.5 entity-framework-6

环境

  • Framework 4.5
  • 实体框架6(代码优先)

模型

Description

  • MainEntity 一对多 ChildEntity 关系
  • ChildEntity 一对多递归 ChildEntity 关系

代码段中的模型

public class MainEntity
{
    public long Id { get; set; }
    public virtual Collection<ChildEntity> ChildEntities { get; set; } 
}

public class ChildEntity
{
    public long Id { get; set; }
    public MainEntity ParentMainEntity { get; set; }
    public virtual Collection<ChildEntity> ChildEntities { get; set; } 
}

注意:ChildEntity只有一层深度的ChildEntities可以作为孩子。

问题

我能够坚持这个模型。这似乎工作正常。只有一个问题。当我存储具有父 ChildEntity ChildEntity 时。 MainEntity_id 字段为NULL,仅设置 ParentChildEntityId 。我希望始终设置 MainEntity_Id 字段的原因是用于性能查询。

如何强制MAINENTITY_ID字段始终在更深层次设置值?

2 个答案:

答案 0 :(得分:0)

第一:

将外键从POCO中删除,给自己带来了困难。向MainEntityId添加ChildEntity属性可让您设置新ChildEntitiesMainEntity的关系。

第二

var newChild =new ChildEntity();
parentEntity.ChildEntities.Add(newChild);
parentEntity.ParentMainEntity.ChildEntities.Add(newChild);

应该可以工作,具体取决于您如何加载实体以及哪些实体已经或将要附加到dbContext。

答案 1 :(得分:0)

您只需要在MainEntity和ChildEntity之间定义您需要的关系。你可以用两种方式做到这一点:

  1. 将[必需]属性放在ChildEntity
  2. 中的ParentMainEntity属性上
  3. 使用流畅的api。在你的DbContext类中重写OnModelCreating方法并在其中放置代码:

    modelBuilder.Entity()。HasRequired(e =&gt; e.ParentMainEntity).WithMany(e =&gt; e.ChildEntities);

  4. 我还建议您将所有实体属性设置为虚拟。当所有都是虚拟的,那么ef而不是使用你的实体类将创建自己的类派生的DynamicProxy类。它们将提供额外的跟踪功能,如果相关对象发生变化,它们会自动更改导航属性的值等.EF似乎可以更好地处理它们。要将该功能用于新创建的对象,您需要使用context.ChildEntities.Create()方法而不是使用构造函数创建它们。当然,因为这会对您的ChildEntity对象添加约束,所以在SaveChanges中将数据持久保存到db期间可能会遇到异常。如果上面的更改是唯一的,那么您应用它很可能至少有一个ChildEntity对象没有分配给它的MainEntity对象。