我使用ObservableCollection来包装一些生成的实体框架对象。 当用户想要编辑某些值时,我打开一个包含字段的弹出窗口,当用户更改并按下保存时 - 更改将保存到数据库中,并且绑定的控件会更改,因为它是一个可观察的集合。
为了防止用户处理同一个绑定对象(它导致同时每个绑定控件的可视化更改)我想使用克隆该对象的一些功能,然后分离原始,附加克隆对象,并将其保存到数据库中。问题是克隆的对象无法正确保存到数据库。如果我只是尝试分离对象,编辑然后附加 - 当分离时它会丢失所有父母和孩子的引用...
WPF中的CRUD标准是什么?如何干净地编辑当前行,同时将其保存在ObservableCollection中?
请帮助......
奥兰
答案 0 :(得分:1)
好吧,我似乎找到了一个很好的解决方案。
首先实现可克隆对象容器:
public class ClonableObjectContainer : Object , ICloneable
{
private Object data;
public ClonableObjectContainer(Object obj)
{
data = obj;
}
public Object Data
{
get { return data; }
}
public object Clone()
{
return (ClonableObjectContainer)this.MemberwiseClone();
}
}
然后使用此对象及其Clone方法创建分离的编辑对象:
ClonableObjectContainer coc = new ClonableObjectContainer(actor);
EntityObject editEntity = (EntityObject)coc.Data;
执行更改后,从ObjectContext中分离原始对象
,附加克隆对象,将其状态更改为EntityState.Modified
并正常保存:
ContextManager.CurrentObjectContext.Detach(oldItem);
ContextManager.CurrentObjectContext.Attach((IEntityWithKey)item);
ContextManager.CurrentObjectContext.ObjectStateManager.ChangeObjectState(item, EntityState.Modified);
ContextManager.Save();
希望它有所帮助...... 奥兰
编辑:如果以下情况不适合您,请查看继续讨论:Entity Framework Attach Exception After Clone