An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

使用AOD.Net Entity Framework 对建立了关系的表新增记录时出现: 

An entity object cannot be referenced by multiple instances of IEntityChangeTracker

中文是: 

一个实体对象不能由多个 IEntityChangeTracker 实例引用  错误

 

问题现象:

一个角色表,一个用户表,用户表中的RoleId引用角色表中的RoleId。对用户表添加记录时,出现上述问题。

程序采用三成架构,级数据访问层、业务逻辑层,在业务逻辑层负责新增操作。

新增数据的代码如下:

表示层:

dmUser user=new User{UserId="test",UserName="test"};       //dmUser是表dmUser在实体模型中的映射

user.dmRoleReference.Value=RoleManager.GetRoleById(roleId);  //添加User表的关联对象

UserManager.Add(user);  //调用UserManager中的Add方法向数据库添加记录

UserManager.Add方法中的主要代码:

using(Entities db=new Entitles)    //Entities,数据库的实体模型

{

     db.AddToUser(user);      //这里出现本文所说的错误

     db.SaveChanges();

}

百思不得其解,反复上网搜索,没有找到答案,虽然找到一篇博文说解决了这个问题,但其所用的方法实在不敢恭维,应该会对程序造成很大的负面影响,而且他那个方法也不能适用到我的代码中。

“对象服务使用 IEntityChangeTracker 的实例来跟踪对附加到 ObjectContext 的对象的更改。对于每个被跟踪对象,都有一个 IEntityChangeTracker 实例。”微软的某一篇文档中有这样一句话,给了我一点提示。

经过多次编写代码验证,终于明白,使用EF更新数据时,如果要更新的对象有相关的对象(换句话说,就是要更新的表有主外键关系),这些对象必须来自同一个IEntityChangeTracker 。

而我的问题就出在user.dmRoleReference.Value=RoleManager.GetRoleById(roleId);  这里,在RoleManager.GetRoleById(roleId)方法中的实体对象和UserManager.Add方法中使用的实体对象不是同一个对象,也就产生了不同的IEntityChangeTracker 实例,因此出现本文所说的错误。

对UserManager.Add方法做如下修改即可

using(Entities db=new Entitles)    //Entities,数据库的实体模型

{

     user.dmRoleReference.Value=db.dmRole.First(r=>r.RoleId==roleId);

     db.AddToUser(user);      

     db.SaveChanges();

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值