【问题标题】:Saving POCO changes保存 POCO 更改
【发布时间】:2011-01-04 03:55:41
【问题描述】:

我在将 POCO 所做的更改保存回数据库时遇到问题。

当应用程序启动时,我将我需要的所有对象抓取到 POCO 对象中,然后当我单击“保存”按钮时,我创建一个新的 ObjectContext 实例,然后我必须循环对象,将它们附加到上下文中,然后检测更改并保存。

    public void SaveData() {
        using (SolEntities sec = new SolEntities(_cxnStr)) {
            foreach (ExtViews.Planet p in Planets) {
                sec.CelestialBodies.Attach(p.TheBody);
                sec.CelestialBodies.ApplyCurrentValues(p.TheBody);
            }
            sec.SaveChanges(SaveOptions.AcceptAllChangesAfterSave | SaveOptions.DetectChangesBeforeSave);
        }
    }

但这似乎不起作用,我可以让它工作的两种方法是: A)在foreach 循环之前创建一个本地行星列表(强制在应用我假设的更改值之前从 Db 生成它们),并删除Attach 语句。 或者 B)切换ApplyCurrentValues这一行:

sec.ObjectStateManager.ChangeObjectState(p.TheBody, System.Data.EntityState.Modified);

但是手动强制为每个对象修改 ObjectState 似乎有点矫枉过正,特别是如果它们没有被修改,我可以在内部保留它是否被修改的东西,但我认为 ApplyCurrentValues 会在第一名?

【问题讨论】:

  • 在这里查看我的答案:stackoverflow.com/questions/3635071/… 它解释了为什么您必须为每个对象设置状态 - 当使用断开连接的对象时,您必须手动进行同步。

标签: c# entity-framework poco


【解决方案1】:

Poco 对象无法跟踪更改。只有实体派生对象可以跟踪更改,否则您必须生成自我跟踪对象或从将跟踪更改的自定义类派生您的 poco 对象。

您可以挂钩您自己对象的属性更改事件或生成代码,以便将您的更改存储在某个本地存储库中,如果您的提交更改成功,您可以清空该存储库。

【讨论】:

    【解决方案2】:

    msdn - 建议使用,

    context.ObjectStateManager.TryGetObjectStateEntry(newItem, out entry);
    

    也可以看看Snapshot based Change tracking

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2011-05-02
      • 2012-03-12
      • 2012-05-16
      • 2012-11-01
      • 2016-01-21
      • 1970-01-01
      • 2017-10-26
      • 2020-07-29
      相关资源
      最近更新 更多