我正在尝试使用WCF RIA服务执行更新语句,但每次更新时我都会继续获取“此EntitySet中已存在具有相同身份的实体。有关我可以从哪里开始查看或找出什么是什么的任何见解错?
第1步
LoadOperation<Analysis> AnalysisLP = ((App)Application.Current)._context.
Load(((App)Application.Current)._context.GetAnalysisQuery().
Where(o => o.ProjectID == Convert.ToInt32(((App)Application.Current).Project.ProjectID)));
第2步
AnalysisLP.Completed += delegate
{
if (!AnalysisLP.HasError)
{
Analysis = AnalysisLP.Entities.FirstOrDefault();
};
第3步
((App)Application.Current)._context.Analysis.Attach(Analysis);
((App)Application.Current)._context.SubmitChanges(OnSubmitCompleted, null);
任何人都可以帮助我,我做错了什么? 感谢
答案 0 :(得分:4)
您的对象Analysis
通过查询来自EntitySet,但仍附加到该EntitySet。
您只需要更改其属性并调用SubmitChanges。不要试图再次附上它。
答案 1 :(得分:1)
为了避免“EntitySet中已存在具有相同标识的实体”异常,更新,修改或删除的实体必须始终在保存时从服务器完全刷新,内存中不能存在对前一个的引用实体的实例。为了防止orhpaned实例闲逛,我遵循以下规则:
实体实例不应该将任何属性更改的事件处理程序直接分配给它们,而是使用OnCreated或OnPropertyNameChanged部分方法。
当实体被添加到EntitySet时,不要指定父实体实例引用,而是使用外键ID属性(myEntity.ParentalID = SelectedParent.ParentalID而不是myEntity.Parent = SelectedParent),因为SelectedParent可能没有获取保存后重新加载,因为它不是工作单元的一部分,因此在保存和刷新后将保留引用。
用作实体的Entity属性的填充源的任何组合框都需要在保存之后重新加载它们的EntitySet;否则填充组合的相关实体将保留对前一个实体实例的引用。