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

我第一次在一个小项目上尝试使用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:

An object with the same key already
exists in the ObjectStateManager. The
existing object is in the Unchanged
state. An object can only be added to
the ObjectStateManager again if it is
in the added state.

很明显,EF 4知道这是基于密钥的重复.

当调用AddOrUpdate时,Repository在为新的或预先存在的对象更新Pocos时,有什么干净,有效的方法,以便后续调用SaveChanges()能做正确的事情?

我确实考虑在对象本身上携带一个isNew标志,但我试图在实际中采取持久性无知.

最佳答案 试着看看
ObjectStateManager.TryGetObjectStateEntry Method,它在
this stackoverflow queston中描述得很好.

点赞