Code First 多对多关联,数据加载问题。

年轻帅小伙 2017-09-19 08:25:23
目前结构大概是这样:

public class User{
public Guid ID{get;set;}
public string UserName{get;set;}
public virtual ICollection<UserRole> UserRole{ get; set; }
}

public class Role{
public Guid ID{get;set;}
public string RoleName{get;set;}
public virtual ICollection<UserRole> UserRole{ get; set; }
}

public class UserRole{
public Guid UserID{get;set;}
[ForeignKey("UserID")]
public virtual User User { get; set; }
public Role RoleID{get;set;}
[ForeignKey("RoleID")]
public virtual Role Role { get; set; }
}

加载的时候会产生无限极的加载下去.
比如: 用户A有角色A,用户B关联了角色A,也关联了角色B,用户C有角色B
查询A的时候

{"ID":"用户AID","UserName":"用户A",
"UserRole":[{"UserID":"用户AID","RoleID":"角色ID","User":[...],"Role":[...]}]}

无限衍生下去。
问:如何查询 User 的时候,查询到对应的角色名称,不要再衍生下去了。尝试过把

[ForeignKey("UserID")]
public virtual User User { get; set; }
[ForeignKey("RoleID")]
public virtual Role Role { get; set; }

这个去除,加载到关联表就停止了,无法满足加载出对应角色名称。
也试过

this.Configuration.LazyLoadingEnabled = false;

相对应的关系表就需要每次使用的时候再出查一次,略显麻烦。
想问下大神,一般这种情况是如何处理的。
...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2017-09-20
  • 打赏
  • 举报
回复
不过最简单的方法,应该还是自己构建一个实体层。 最后将内容都select到这个实体层,包括关联项也放进去。 但是这个关联项不用再设置一个外键关联主表。
正怒月神 2017-09-20
  • 打赏
  • 举报
回复
无限衍生这个问题并不是实体层的问题。 而是json转换时的深度循环问题。 我看了许多文章,发觉没有太好额解决方案。 http://blog.csdn.net/hanjun0612/article/details/59078428
年轻帅小伙 2017-09-20
  • 打赏
  • 举报
回复
引用 4 楼 ilikeff8 的回复:
还是用dbfirst吧,用codefirst是和自己过不去,数据库结构设计的事交给数据库去处理和设置,出了问题也好查,何况有写数据库是客户的,根本不允许修改结构
额,研究的玩一下。以前是用的db first。现在没事弄弄 code first ,感觉确实要比db first 要方便(目前是指代码量减少,实际还有好多问题都没研究透。)
年轻帅小伙 2017-09-20
  • 打赏
  • 举报
回复
引用 2 楼 masanaka 的回复:
因为是virtual的,在EF6.x里LazyLoading应该是只有你访问了对象属性才会去加载的吧? 也就是说,你不访问User.UserRole.Role.UserRole...,这是不会加载的吧? 一般也就是关闭LazyLoading后用eager loading去取关联数据的。
使用 eager loading 数据量庞大的时候,基本查询也就玩完了吧。 以前弄 db first 是用这种机制,感觉效率上确实比较受影响。
masanaka 2017-09-20
  • 打赏
  • 举报
回复
因为是virtual的,在EF6.x里LazyLoading应该是只有你访问了对象属性才会去加载的吧? 也就是说,你不访问User.UserRole.Role.UserRole...,这是不会加载的吧? 一般也就是关闭LazyLoading后用eager loading去取关联数据的。
年轻帅小伙 2017-09-20
  • 打赏
  • 举报
回复
引用 1 楼 a448410274 的回复:
没人么?
使用 eager loading 数据量庞大的时候,基本查询也就玩完了吧。 以前弄 db first 是用这种机制,感觉效率上确实比较受影响。
ilikeff8 2017-09-20
  • 打赏
  • 举报
回复
还是用dbfirst吧,用codefirst是和自己过不去,数据库结构设计的事交给数据库去处理和设置,出了问题也好查,何况有写数据库是客户的,根本不允许修改结构
年轻帅小伙 2017-09-20
  • 打赏
  • 举报
回复
没人么?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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