C# 保存POCO更改
我无法将对POCO的更改保存回数据库 当应用程序启动时,我将需要的所有对象抓取到POCO对象中,然后当我单击“保存”按钮时,我创建一个新的ObjectContext实例,然后我必须循环对象,将它们附加到上下文,然后检测更改并保存C# 保存POCO更改,c#,entity-framework,poco,C#,Entity Framework,Poco,我无法将对POCO的更改保存回数据库 当应用程序启动时,我将需要的所有对象抓取到POCO对象中,然后当我单击“保存”按钮时,我创建一个新的ObjectContext实例,然后我必须循环对象,将它们附加到上下文,然后检测更改并保存 public void SaveData() { using (SolEntities sec = new SolEntities(_cxnStr)) { foreach (ExtViews.Planet p in Pla
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
sament。
或
B) 切换此选项的ApplyCurrentValues
行:
sec.ObjectStateManager.ChangeObjectState(p.TheBody, System.Data.EntityState.Modified);
但是手动强制修改每个对象的ObjectState似乎有点过分了,特别是如果它们没有被修改,我可以在内部保留它是否被修改的信息,但我认为ApplyCurrentValues首先会这样做?Poco对象无法跟踪更改。只有实体派生的对象可以跟踪更改,否则您必须生成自跟踪对象或从将跟踪更改的自定义类派生poco对象 您可以钩住自己对象的属性更改事件,或者以这样的方式生成代码,将更改存储在某个本地存储库中,如果提交更改成功,您可以清空该存储库 -建议使用
context.ObjectStateManager.TryGetObjectStateEntry(newItem, out entry);
也有看 检查我的答案:它解释了为什么您必须为每个对象设置状态-当使用断开连接的对象时,您必须手动执行同步。