我无法将对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会在第一名?
答案 0 :(得分:3)
Poco对象无法跟踪更改。只有实体派生对象可以跟踪更改,否则您必须生成自我跟踪对象或从自定义类派生poco对象,这将跟踪更改。
您可以挂钩您自己的对象的属性更改事件或生成代码,以便使用某些本地存储库存储您的更改,如果您的提交更改成功,您可以将其清空。
答案 1 :(得分:0)
msdn - 建议使用,
context.ObjectStateManager.TryGetObjectStateEntry(newItem, out entry);