我有一个使用 Entity Framework Code First 定义的实体,它有一个可选的父节点字段。空父节点值意味着实体的节点位于根节点。同一父级下将有多个子级。
Class ContentDescriptor
{
virtual ObjectId ParentObjectId{get;set;}
}
在数据库初始化程序中:
HasOptional(contentDescriptor => contentDescriptor.ParentObjectId).WithOptionalDependent()
.Map(m => m.MapKey("ParentObjectId"));
导航属性分配如下:
DBContext.ContentDescriptors.Add(contentDescriptor);
contentDescriptor.ParentObjectId = ObjectIdFactory.Save(parent);
ObjectIdFactory.Save 检查 DBContext.ObjectId.Local 中是否有条目,然后检查 DBContext.ObjectId,如果内存或 DB 中没有记录,则进行插入并返回结果。
但是,当将新节点添加到上下文时,只有父节点的第一个子节点才能正确保存。第二个和以后的子级被添加到根,即使它们在本地显示为父级的子级。看起来框架在添加实体时无法为外键生成更新查询。
我的解决方法是在实体中公开外键并手动分配外键,但我想知道是否有更优雅的解决方案:
HasOptional(contentDescriptor => contentDescriptor.ParentObjectId).WithMany().
HasForeignKey(c=>c.ParentObjectIdRaw);
Property(c => c.ParentObjectIdRaw).HasColumnName("ParentObjectId");
contentDescriptor.ParentObjectIdRaw = contentDescriptor.ParentObjectId.ObjectIdId;