我首先使用 MVC.NET Web api、EF 和 DB,并且在上下文中关闭了延迟加载。即使关闭了 LazyLoading,EF 也会返回太多数据。
例如,我有一个具有一种角色的用户。当我查询 Users 和 Include Role 时,Role.Users 属性会自动填充数据,因为 Users 已加载到上下文中。
为什么我不能让 EF 满足我的要求?或者我在这里错过了一些大事?
public partial class User
{
public int UserID { get; set; }
public string Title { get; set; }
public string Email { get; set; }
public int RoleID { get; set; }
....
public virtual Role Role { get; set; }
}
public partial class Role
{
public int RoleID { get; set; }
public string RoleName { get; set; }
....
public virtual ICollection<User> Users { get; set; }
}
return db.Users.Include(u => u.Role);
// ^^ user.Role.Users is filled with 1000s of users
TL;DR - 我希望 EF 永远不会将数据加载到导航属性/集合中,除非我直接 .Include() 。当序列化为 JSON 时,我只想要我明确要求的内容。似乎即使关闭延迟加载,上下文中已经存在的导航属性(即通常是“循环引用”)也会被加载并返回。
您所看到的行为称为关系修复 https://stackoverflow.com/a/6259284/270591并且您无法禁用它。
如果您正在加载具有角色的用户来序列化它们并将它们发送到某个地方,我想您不想在它们已加载的上下文中跟踪实体的更改。因此,不需要将它们附加到上下文并且您可以使用:
return db.Users.Include(u => u.Role).AsNoTracking();
或者按照 @STLRick 的建议,使用投影到专门用于序列化的对象中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)