有效地确定ObjectSet中是否已存在EF 4 POCO

有效地确定ObjectSet中是否已存在EF 4 POCO,poco,entity-framework-4,persistence-ignorance,Poco,Entity Framework 4,Persistence Ignorance,我第一次在一个小项目上尝试与POCO的EF4。在我的存储库实现中,我想提供一个AddOrUpdate方法,如果传入的POCO是新的,它将向存储库添加一个,否则什么都不做(因为调用SaveChanges时将保存更新的POCO) 我的第一个想法是这样做: public void AddOrUpdate(Poco p) { if (!Ctx.Pocos.Contains<Poco>(p)) { Ctx.Pocos.AddObject(p); } }

我第一次在一个小项目上尝试与POCO的EF4。在我的存储库实现中,我想提供一个AddOrUpdate方法,如果传入的POCO是新的,它将向存储库添加一个,否则什么都不做(因为调用SaveChanges时将保存更新的POCO)

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

public void AddOrUpdate(Poco p)
{
    if (!Ctx.Pocos.Contains<Poco>(p))
    {
        Ctx.Pocos.AddObject(p);
    }
}
public void AddOrUpdate(Poco p)
{
如果(!Ctx.Pocos.Contains(p))
{
Ctx.Pocos.AddObject(p);
}
}
但是,这会导致出现
NotSupportedException
(额外问题:为什么不支持?)

只需删除
Contains
部分并始终调用AddObject,就会导致
InvalidStateException

已存在具有相同密钥的对象 存在于ObjectStateManager中。这个 现有对象处于“未更改”状态 国家。只能将对象添加到 如果ObjectStateManager 处于添加状态

很明显,EF4知道这是一个基于密钥的副本

当调用AddOrUpdate时,存储库为新对象或预先存在的对象更新Pocos的干净、高效的方法是什么,以便后续调用SaveChanges()将做正确的事情


<>我确实考虑过在对象本身上携带一个ISO标志,但是我尝试着坚持实践的无知。

试着看,这是很好的描述。

啊,是的,看来你也设法避免落在EF4成功的坑里。@威尔:我强烈地考虑NHiBiNe和S.但看起来他们才刚刚开始支持VS2010和.NET4。不确定这条路是否会更容易。