即使我不要求,实体框架也始终包含上下文中的数据

chr*_*34p 20 c# frameworks entity entity-framework

我首先使用MVC.NET web api,EF和DB,我在上下文中关闭了延迟加载.即使关闭了LazyLoading,EF也会返回过多的数据.

例如,我有一个角色的用户.当我查询用户和包含角色时,Role.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
Run Code Online (Sandbox Code Playgroud)

TL; DR - 我希望EF永远不会将数据加载到导航属性/集合中,除非我直接插入()它.在序列化为JSON时,我想要明确要求的内容.似乎即使延迟加载,也会加载并返回已经在上下文中的导航属性(即通常为"循环引用").

Sla*_*uma 20

您所看到的行为称为" 关系修正",您无法禁用它.

如果您正在加载具有角色的用户来序列化它们并将它们发送到某个地方,我猜您不希望跟踪它们已被加载的上下文中的实体更改.因此,无需将它们附加到上下文和您可以使用:

return db.Users.Include(u => u.Role).AsNoTracking();
Run Code Online (Sandbox Code Playgroud)

或者使用投影到专门用于序列化的对象,如@STLRick所建议的那样.

  • 出于某种原因,当我尝试 AsNoTracking 时,我会在序列化过程中出错。 (2认同)

Ric*_*sen -3

第一:打开延迟加载。

第二:如果您想过滤检索和返回的内容,请执行自定义返回对象或其他操作。

from u in db.Users
join r in db.Roles
  on u.RoleID equals r.RoleID
select new { u.UserID, u.Title, u.Email, r.RoleName }
Run Code Online (Sandbox Code Playgroud)

或类似的东西。您将有一个最小的返回对象,并且您的对象图将很小。