首页 新闻 会员 周边 捐助

急救!!!entity framework 问题

0
[待解决问题]
 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对象的赋值方式,进行保存成功?
|ī笨笨﹎ヤ的主页 |ī笨笨﹎ヤ | 初学一级 | 园豆:2
提问于:2012-11-26 22:05
< >
分享
所有回答(3)
-1

关键字是自增涨。

jerry-Tom | 园豆:4077 (老鸟四级) | 2012-11-27 11:17

你说的完全和我的问题无关

支持(0) 反对(0) |ī笨笨﹎ヤ | 园豆:2 (初学一级) | 2012-11-27 11:25
0

这个错误是因为不同context的跟踪对象。你只要保证DAL<User>和DAL<Role>中德Context相同就可以了。

另外推荐使用IUnitOfWork的模式,放弃DAL

today4king | 园豆:3499 (老鸟四级) | 2012-11-27 11:22

能发个链接或者例子还给我看下什么是IUnitOfWork么?

支持(0) 反对(0) |ī笨笨﹎ヤ | 园豆:2 (初学一级) | 2012-11-27 11:24
0

ef本来就可以这样添加。
但是你的逻辑好像有点问题:

Add User的时候, User实体已标记为Added将要添加,这时你的Role属性也被标记为Added,但是 你的 Role已经存在了,这样的添加没有问题吗?

 

方式一: 添加User方式,只给 User的RoleId赋值;

方式二: 更新Role方式, 给Role的 List<User> 再添加一个User,进行更新Role,到达添加User的目的

方式三:直接执行sql语句。

Qlin | 园豆:2403 (老鸟四级) | 2012-11-27 13:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册