保存POCO更改

时间:2011-01-03 19:04:35

标签: c# entity-framework poco

我无法将对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会在第一名?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

msdn - 建议使用,

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

另请查看Snapshot based Change tracking