【问题标题】:EF 4, POCO and AddOrUpdateEF 4、POCO 和 AddOrUpdate
【发布时间】:2010-06-08 01:47:25
【问题描述】:

我正在尝试在名为 AddOrUpdate 的 EF 4 POCO 存储库上创建一个方法。

这个想法是业务层可以传入一个 POCO 对象,如果该对象是新的(尚未在数据库中),持久性框架将添加该对象,否则将更新数据库(一旦调用 SaveChanges())新值。这与我问过的关于 EF 的其他一些问题类似,但我只有大约 80% 的人理解这一点,所以请原谅部分重复。

我缺少的部分是一旦我确定业务对象确实已经存在于数据库中(现在已经加载,谢谢TryGetObjectByKey)。 ApplyCurrentValues 听起来有点像我想要的,但它只复制标量值,似乎并不打算更新 ObjectContext/ObjectSet 中的对象图。由于我的特殊用例,我现在不关心并发。

public void AddOrUpdate(BO biz)
{
    object obj;

    EntityKey ek = Ctx.CreateEntityKey(mySetName, biz);
    bool found = Ctx.TryGetObjectByKey(ek, out obj);

    if (found)
    {
        // How do I do what this method name implies?  Biz is a parent with children.
        mySet.TellTheSetToUpdateThisObject(biz);
    }
    else
    {
        mySet.AddObject(biz);
    }

    Ctx.DetectChanges();
}

【问题讨论】:

    标签: poco entity-framework-4


    【解决方案1】:

    您必须为此编写代码。没有任何内容可以复制整个图形。正如您所说,ApplyCurrentValues 将适用于标量值。您必须自己复制的孩子。

    【讨论】:

    • @Craig:因此,如果我通过 EF 4 加载具有孩子(可能还有孙子等)的 POCO 父对象,请更改一些子对象(修改现有对象、添加新对象、删除一些对象) ,我必须手动更新ObjectContext中的对象图?
    • 没有。如果您从上下文加载并且实体进行某种形式的更改跟踪,这是自动的。只有当您从断开连接的实体中复制时,您才能独立完成。
    • @Craig:我最初确实从上下文加载,但发现我的更改没有应用于对 SaveChanges() 的调用。 POCO 对象需要做什么更改跟踪?而如果要实现变更跟踪机制,那它真的还是 POCO 对象吗?
    • Eric,“纯”POCO 不进行更改跟踪,因此不适合轻松跟踪更改。 :) EF 可以使用快照、自我跟踪实体或代理类型跟踪对 POCO 的更改。您可以在文档中了解这些选项及其优缺点:msdn.microsoft.com/en-us/library/bb738470.aspx 您可能正在寻找 DetectChanges,但就像我说的,您需要通读 POCO 更改跟踪部分。
    • @Craig:感谢您的帮助。我一直在尝试翻阅 MSDN 文档和各种博客,但似乎无法准确掌握 EF 4 的工作方式和不工作方式。从您发送By default, the object context calls this method before saving the data to the data source 的链接向我暗示SaveChanges() 将调用DetectChanges(),但我会尝试明确调用以查看是否有帮助。
    【解决方案2】:

    问题是我的业务对象使用 new() 运算符来分配子对象,而不是从 ObjectContext 构造对象。如果您不能使用 new(),则不是真正的 POCO 行为,但至少在一些重构之后它可以工作。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多