4

我第一次在一个小项目上尝试使用 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 标志,但我试图尽可能地考虑持久性无知。

4

1 回答 1

2

尝试查看ObjectStateManager.TryGetObjectStateEntry 方法,在这个 stackoverflow queston中有很好的描述。

于 2010-06-06T21:12:05.830 回答