有效地确定EF4 POCO是否已经在ObjectSet中

时间:2010-06-06 19:47:14

标签: poco entity-framework-4 persistence-ignorance

我第一次在一个小项目上尝试使用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标志,但我试图在实际中采取持久性无知。

1 个答案:

答案 0 :(得分:2)