EF中多对多关系怎么修改的

蔡挨踢 2014-07-13 08:37:30
请教一下。用EF进行多对多关系的修改时。是怎么处理的。比如我用户跟角色。。
我是用codeFirst的方式的,我建了两个类,一个User,一个Role,两个各有一个导航属性ICollection<User> Users,还有ICollection<Role> Roles
我进行修改时,是把用户的角色user.Roles查出来后用foreach全部remove掉,然后再把新的角色添加上。还是有其它比较方便方法

...全文
701 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
本人愚见 2015-09-17
  • 打赏
  • 举报
回复
如果要修改User 的数据,然后删除关联表的数据然后在重新向关联表添加数据,这样怎么处理(有三个类的,一个User,一个Role和一个UserRole_Map)
moon铭 2014-07-17
  • 打赏
  • 举报
回复
楼主,已经搞定了,那个关系clear就可以了,不用一个个remove,然后直接赋值就可以,不知道为什么得先clear。其实主要问题是我的实体不是从数据库中取出来的,直接赋值,是无法修改的,必须得把数据库实体进行处理。
蔡挨踢 2014-07-16
  • 打赏
  • 举报
回复
引用 11 楼 qijunming1208 的回复:
楼主,你好,我也遇到了这个问题,我没看明白,想再请教下你,看到请回复。
你还有啥不明的。
moon铭 2014-07-14
  • 打赏
  • 举报
回复
楼主,你好,我也遇到了这个问题,我没看明白,想再请教下你,看到请回复。
蔡挨踢 2014-07-13
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
[quote=引用 5 楼 bestcjt 的回复:] 我刚接触这个EF。之前都是用SQL语句操作这中间的关系表的。。以前是delete from UserRole where uId=1 这样先删了ID为1的用户的所有用户。然后再insert into 用户新的角色关系记录下去。。不过我在网上查到有一篇文章上面说EF对这种多对多关系的作法不太一样,我就想了解下是不是有更方便的方法,那篇文章http://51kaifa.net/article-149.html 原理我是明白的,但我还是想学多点EF一些方便的东西
按照你贴出引用的这个文章的说法,你只要在你的User对象中修改其Roles集合中的对象,那么EF会自动去逐一更新另外两个表(Role表和中间关联表),也就是把你需要写5、6行代码的工作给自动化了。 你可以测试一下,看看是不是真有那个功能。[/quote] 这个可以实现。我是想知道这个关系是怎么修改的,只是上面有一段话,如下 一般地,我们手动更新多对多关系表时,方法是:删除原来关系,插入新关系,而EF的作法不是这样,它是先比较现在有集合与数据表里的内容是否相同,如果相同不进行操作,如果没有就插入,如果有就删除,性能上有了一个提升! 我是想知道在已有关系后,怎么再去维护了。 比如说我有个用户user1,对应的角色role1,role2, 那以后我想修改这个user1的关系只有role1,以前的作法是先把关系表中user1对应的role1跟role2记录删除了,再插入role1的记录,我主要是看了上面的话后,想了解EF是不是有更好的性能,可以知道我关系表里已经存了user1对应的role1,它只是帮我删除了role2,如果有这样的机制,那确实在对多对多关系比较多的情况下可以提高性能
  • 打赏
  • 举报
回复
引用 5 楼 bestcjt 的回复:
我刚接触这个EF。之前都是用SQL语句操作这中间的关系表的。。以前是delete from UserRole where uId=1 这样先删了ID为1的用户的所有用户。然后再insert into 用户新的角色关系记录下去。。不过我在网上查到有一篇文章上面说EF对这种多对多关系的作法不太一样,我就想了解下是不是有更方便的方法,那篇文章http://51kaifa.net/article-149.html 原理我是明白的,但我还是想学多点EF一些方便的东西
按照你贴出引用的这个文章的说法,你只要在你的User对象中修改其Roles集合中的对象,那么EF会自动去逐一更新另外两个表(Role表和中间关联表),也就是把你需要写5、6行代码的工作给自动化了。 你可以测试一下,看看是不是真有那个功能。
  • 打赏
  • 举报
回复
引用 楼主 bestcjt 的回复:
请教一下。用EF进行多对多关系的修改时。是怎么处理的。比如我用户跟角色。。 我是用codeFirst的方式的,我建了两个类,一个User,一个Role,两个各有一个导航属性ICollection<User> Users,还有ICollection<Role> Roles 我进行修改时,是把用户的角色user.Roles查出来后用foreach全部remove掉,然后再把新的角色添加上。还是有其它比较方便方法
我不用EF,不是很清楚EF有什么高级的自动化特色。 但是假设EF只是很低级的工具,你要处理“多对多”关系,你就只有另外维护一个“中间表”。例如叫做“授权配对”的实体(数据库表),当你修改时,你修改这个“授权配对”中的数据,去增加或者删除相关的记录。根本不用跑到User或者Role上去处理。
蔡挨踢 2014-07-13
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
没有什么直接的“多对多”关系。都是把一个“多对多”转化为两个“一对多”处理的。 别人的繁琐的程序封装你完全可以不用,但是你应该了解原理。
我刚接触这个EF。之前都是用SQL语句操作这中间的关系表的。。以前是delete from UserRole where uId=1 这样先删了ID为1的用户的所有用户。然后再insert into 用户新的角色关系记录下去。。不过我在网上查到有一篇文章上面说EF对这种多对多关系的作法不太一样,我就想了解下是不是有更方便的方法,那篇文章http://51kaifa.net/article-149.html 原理我是明白的,但我还是想学多点EF一些方便的东西
  • 打赏
  • 举报
回复
没有什么直接的“多对多”关系。都是把一个“多对多”转化为两个“一对多”处理的。 别人的繁琐的程序封装你完全可以不用,但是你应该了解原理。
蔡挨踢 2014-07-13
  • 打赏
  • 举报
回复
引用 1 楼 wangnaisheng 的回复:
http://www.cnblogs.com/haogj/archive/2011/05/08/2040106.html
那文章早就看过。根据就没说到这个怎么修改的
蔡挨踢 2014-07-13
  • 打赏
  • 举报
回复
还有谢谢sp1234的帮助
蔡挨踢 2014-07-13
  • 打赏
  • 举报
回复
总算找出个比较方便的方法了 比如我现在有个用户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再进行比较。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧