我第一次尝试使用Poco的小型项目来尝试EF 4。在我的存储库实施中,我想提供一个方法addorupdate,如果它是新的,它将向存储库中添加传递的POCO,否则什么也不做(因为在调用Savechanges时将保存更新的POCO)。

我的第一个想法是这样做:

public void AddOrUpdate(Poco p)
{
    if (!Ctx.Pocos.Contains<Poco>(p))
    {
        Ctx.Pocos.AddObject(p);
    }
}

但是,这导致了 NotSupportedException 如下记录 引用非量表变量不支持 (奖励问题:为什么不支持?)

只是删除 Contains 部分并始终调用AddObject结果 InvalidStateException:

具有相同密钥的对象已经存在于对象statemanager中。现有对象处于不变状态。只有对象在添加的状态中,才能再次将对象添加到ObjectStateManager。

因此,显然EF 4在某处知道这是基于密钥的重复。

当调用AddOrupDate时,存储库更新新的或预先存在的对象的POCOS是什么干净,有效的方法,以便随后的SaveChanges()调用将做对的事情?

我确实考虑在对象本身上载有isnew旗,但我试图将坚持不懈的无知毫无用处。

有帮助吗?

解决方案

尝试看 ObjectStateManager, ,很好地描述了 此stackoverflow Queston.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top