1 public abstract class Base { } 2 public class User : Base 3 { 4 public Role Role { get; set; } 5 } 6 public class Role : Base 7 { 8 public List<User> Users { get; set; } 9 public List<Right> Rights { get; set; } 10 } 11 public class Right : Base 12 { 13 public List<Role> Roles { get; set; } 14 } 15 public class DAL<T> where T : Base 16 { 17 public int Add(T obj) 18 { 19 Context.DbSet<T>().Add(obj); 20 Context.SaveChanges();//报错 21 //一个实体对象不能由多个 IEntityChangeTracker 实例引用。 22 } 23 }
Add(T obj)是一个通用的函数,现在在对哪些有主外键关系的实体进行赋值的时候,就会报"
一个实体对象不能由多个 IEntityChangeTracker 实例引用",有没有办法在不修改obj对象的value的情况下,解决报错的问题。
例如:上面的User,Role,Right三个实体,现在要添加一个User对象,会让用户选择一个“角色名称” ;那么在添加的时候,根据选择的的名称,找到数据库匹配的数据,然后返回一个Role对象,然后赋值给新创建的User对象。然后再把User对象作为Add(T obj)的参数,进行添加数据,执行到保存的时候,就报错。有没有办法在不修改前面obj对象的赋值方式,进行保存成功?
关键字是自增涨。
你说的完全和我的问题无关
这个错误是因为不同context的跟踪对象。你只要保证DAL<User>和DAL<Role>中德Context相同就可以了。
另外推荐使用IUnitOfWork的模式,放弃DAL
能发个链接或者例子还给我看下什么是IUnitOfWork么?
ef本来就可以这样添加。
但是你的逻辑好像有点问题:
Add User的时候, User实体已标记为Added将要添加,这时你的Role属性也被标记为Added,但是 你的 Role已经存在了,这样的添加没有问题吗?
方式一: 添加User方式,只给 User的RoleId赋值;
方式二: 更新Role方式, 给Role的 List<User> 再添加一个User,进行更新Role,到达添加User的目的
方式三:直接执行sql语句。