环境
模型
代码段中的模型
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字段始终在更深层次设置值?
答案 0 :(得分:0)
第一:
将外键从POCO中删除,给自己带来了困难。向MainEntityId
添加ChildEntity
属性可让您设置新ChildEntities
与MainEntity
的关系。
第二
var newChild =new ChildEntity();
parentEntity.ChildEntities.Add(newChild);
parentEntity.ParentMainEntity.ChildEntities.Add(newChild);
应该可以工作,具体取决于您如何加载实体以及哪些实体已经或将要附加到dbContext。
答案 1 :(得分:0)
您只需要在MainEntity和ChildEntity之间定义您需要的关系。你可以用两种方式做到这一点:
使用流畅的api。在你的DbContext类中重写OnModelCreating方法并在其中放置代码:
modelBuilder.Entity()。HasRequired(e =&gt; e.ParentMainEntity).WithMany(e =&gt; e.ChildEntities);
我还建议您将所有实体属性设置为虚拟。当所有都是虚拟的,那么ef而不是使用你的实体类将创建自己的类派生的DynamicProxy类。它们将提供额外的跟踪功能,如果相关对象发生变化,它们会自动更改导航属性的值等.EF似乎可以更好地处理它们。要将该功能用于新创建的对象,您需要使用context.ChildEntities.Create()方法而不是使用构造函数创建它们。当然,因为这会对您的ChildEntity对象添加约束,所以在SaveChanges中将数据持久保存到db期间可能会遇到异常。如果上面的更改是唯一的,那么您应用它很可能至少有一个ChildEntity对象没有分配给它的MainEntity对象。