我第一次在一个小项目上尝试使用 POCO 的 EF 4。在我的 Repository 实现中,我想提供一个 AddOrUpdate 方法,如果它是新的,它将向存储库添加传入的 POCO,否则什么都不做(因为在调用 SaveChanges 时将保存更新的 POCO)。
我的第一个想法是这样做:
public void AddOrUpdate(Poco p)
{
if (!Ctx.Pocos.Contains<Poco>(p))
{
Ctx.Pocos.AddObject(p);
}
}
但是,这会导致参考不支持NotSupportedException
的非标量变量(额外问题:为什么不支持?)
只需删除该Contains
部分并始终调用 AddObject 会导致InvalidStateException
:
ObjectStateManager 中已存在具有相同键的对象。现有对象处于未更改状态。只有处于添加状态的对象才能再次添加到 ObjectStateManager。
很明显,EF 4 在某处知道这是基于密钥的副本。
当调用 AddOrUpdate 以便随后调用 SaveChanges() 时,存储库为新的或预先存在的对象更新 Pocos 的一种干净、有效的方法是什么?
我确实考虑过在对象本身上携带一个 isNew 标志,但我试图尽可能地考虑持久性无知。