此EntitySet中已存在具有相同标识的实体

时间:2011-07-09 02:06:17

标签: silverlight entity-framework wcf-ria-services

我正在尝试使用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);

任何人都可以帮助我,我做错了什么? 感谢

2 个答案:

答案 0 :(得分:4)

您的对象Analysis通过查询来自EntitySet,但仍附加到该EntitySet。

您只需要更改其属性并调用SubmitChanges。不要试图再次附上它。

答案 1 :(得分:1)

为了避免“EntitySet中已存在具有相同标识的实体”异常,更新,修改或删除的实体必须始终在保存时从服务器完全刷新,内存中不能存在对前一个的引用实体的实例。为了防止orhpaned实例闲逛,我遵循以下规则:

实体实例不应该将任何属性更改的事件处理程序直接分配给它们,而是使用OnCreated或OnPropertyNameChanged部分方法。

当实体被添加到EntitySet时,不要指定父实体实例引用,而是使用外键ID属性(myEntity.ParentalID = SelectedParent.ParentalID而不是myEntity.Parent = SelectedParent),因为SelectedParent可能没有获取保存后重新加载,因为它不是工作单元的一部分,因此在保存和刷新后将保留引用。

用作实体的Entity属性的填充源的任何组合框都需要在保存之后重新加载它们的EntitySet;否则填充组合的相关实体将保留对前一个实体实例的引用。