我刚接触这个EF。之前都是用SQL语句操作这中间的关系表的。。以前是delete from UserRole where uId=1 这样先删了ID为1的用户的所有用户。然后再insert into 用户新的角色关系记录下去。。不过我在网上查到有一篇文章上面说EF对这种多对多关系的作法不太一样,我就想了解下是不是有更方便的方法,那篇文章http://51kaifa.net/article-149.html
原理我是明白的,但我还是想学多点EF一些方便的东西
总算找出个比较方便的方法了
比如我现在有个用户ID为1对应的用色为ID为1的role1,ID为2的role2,我现在我将用户的角色修改为id为1的role1跟ID为5的role5,可以这样处理
User user = context.Users.First(u => u.Id == 1);//到数据库里查询ID为1的用户,必须得查询出来,用ATTACH方法,会出错
Role r1 = new Role { Id = 1 };//ID为1的role1
Role r2 = new Role { Id = 5 };//ID为5的role5
context.Roles.Attach(r1);//将role1附加到上下文
context.Roles.Attach(r2);//将role1附加到上下文
user.Roles.Clear();//将用户所对应的角色清空
user.Roles.Add(r1);//将role1增加到用户所对应的角色集合里
user.Roles.Add(r2);//将role1增加到用户所对应的角色集合里
context.SaveChanges();//提交修改
一开始看我以为上面的生成的SQL会是先删除用户所有对应的角色,结果用profiler一看,才发现,EF是根据用户已存在的角色再比较我添加的角色,再生成对应的SQL语句,比较上面的,EF就只会删除用户对应的角色role2,新增个角色role5的关系记录,因为role1本来就存在的。所以并不会去处理这条关系记录。
不过这种EF还是比手写语句多查询了两次,一次是根据ID查询用户,一次是EF去数据库里把用户所对应的角色全部查出来,然后EF再进行比较。