让我将我的经历与这个令人讨厌的错误联系起来,并指出追逐它的地形会带你去寻找一个非常简单的解决方案。
CompanyGroup 非常简单。它有一个名称,并且有一个 Company 对象。
我是从这个开始的:
1 public static void Add(CompanyGroup item)
2 {
3 try
4 {
5 using (Entities scope = new Entities())
6 {
7 scope.AddToCompanyGroup(item);
8 scope.SaveChanges();
9 }
10 }
11 catch (Exception ex)
12 {
13 LogException(ex, item);
14 throw;
15 }
16 }
得到了这个错误:
{"实体对象不能
被多个实例引用
IEntityChangeTracker。"}
所以,我在第 6 行和第 7 行之间添加了这个:
(IEntityWithChangeTracker)item).SetChangeTracker(null);
这奖励了我:
{"该对象无法添加到
ObjectStateManager 因为它已经
有一个 EntityKey。采用
ObjectContext.Attach 附加一个
具有现有键的对象。"}
所以我改变了
scope.AddToCompanyGroup(item);
到
scope.Attach(item);
现在它抱怨:
{"具有临时 EntityKey 的对象
值不能附加到对象
上下文。”}
(开始听起来像我年轻时约会过的一些女孩——从不满足——但我离题了)
所以我将实体键设为空(不起作用)并使用该方法创建新的(也不起作用)
一路上,我也遇到了这个错误:
{"这个的源查询
EntityCollection 或 EntityReference
相关时无法退换
对象处于添加状态或
一个分离的状态,不是
最初使用
NoTracking 合并选项。"}
解决方案?
将核心,第 7 行和第 8 行替换为:
CompanyGroup newcg = new CompanyGroup();
newcg.GroupName = item.GroupName;
newcg.Company = scope.Company.Where(c => c.CompanyID == item.Company.CompanyID).First();
scope.AddToCompanyGroup(newcg);
scope.SaveChanges();
本质上,我将通过“item”传递的数据,并将其移动到新创建的引入相同类型的对象中
范围作为添加中使用的范围。