在主细节关系中保留详细信息EF4 POCO
问题描述:
场景:实体框架4,POCO模板和主细节关系。在主细节关系中保留详细信息EF4 POCO
可以说我有一个主类型是这样的:
//partial implementation of master entity
partial class Master
{
public void AddDetail(x,y,z)
{
var detail = new Detail()
{
X = x,
Y = y,
Z = z,
};
//add the detail to the master
this.Details.Add(detail);
}
}
如果我再主实例添加到我的上下文并提交,具体细节将不会被保存:
var masterObject = new Master();
masterObject.AddDetail(1,2,3);
myContext.MasterSet.AddObject(masterObject);
有在使用POCO模板时,有什么方法可以使细节保持不变? 或者其他方式? Master实体中的Details集合是FixUpCollection,因此它应该跟踪IMO的更改。
那么,任何想法如何使这项工作W/O杀死POCO'ness太多?
答
我找到了解决方案。
我只需要通过SaveOptions.DetectChangesBeforeSave像这样:
context.SaveChanges(SaveOptions.DetectChangesBeforeSave);
这使我细节对象添加到主对象的w/o每个单独的细节附加到上下文。
答
您可能:
添加一个构造函数,以您的实体,它接受一个上下文,通过引用在私有字段保存。然后,您的AddDetail
函数可以检查专用_context
字段,并且如果它引用了实例化的上下文,则在保存主记录后,将细节添加到上下文中。
但是...
这可能不是最好的模式,因为它违反了单一职责原则。我认为使用Repository模式会更好,并让Repository提交未保存的Details。 Here是一个关于在实体框架4中实施存储库模式的好文章。
第一个建议很糟糕地违反了POCO。 而第二个建议并不能解决更改细节的问题。 存储库应该存储聚合根,你不应该有一个聚合中的子对象。 因此,在存储库中解决这个问题需要检查一个细节是新的还是已经存在的等等。 – 2010-05-20 19:22:51