我第一次在一个小项目上尝试使用POCO的EF 4。在我的Repository实现中,我想提供一个方法AddOrUpdate,如果它是新的,它将把传入的POCO添加到存储库,否则什么都不做(因为在调用SaveChanges时将保存更新的POCO)。
我的第一个想法是这样做:
public void AddOrUpdate(Poco p)
{
if (!Ctx.Pocos.Contains<Poco>(p))
{
Ctx.Pocos.AddObject(p);
}
}
然而,这导致Referencing Non-Scalar Variables Not Supported下记录的NotSupportedException
(红利问题:为什么不支持?)
只需移除Contains
部分并始终调用AddObject即可生成InvalidStateException
:
具有相同密钥的对象 存在于ObjectStateManager中。该 现有对象在Unchanged中 州。只能添加对象 如果是,则再次返回ObjectStateManager 在增加的状态。
很明显,EF 4知道这是基于密钥的重复。
当调用AddOrUpdate时,Repository更新Pocos以获取新的或预先存在的对象,以便后续调用SaveChanges()能做正确的事情,这是一种干净,有效的方法吗?
我确实考虑在对象本身上携带一个isNew标志,但我试图在实际中采取持久性无知。
答案 0 :(得分:2)