gpt4 book ai didi

c# - Entity Framework 为包含属性返回 null

转载 作者:太空狗 更新时间:2023-10-30 00:40:38 25 4
gpt4 key购买 nike

我有 3 个具有多对多连接的实体(表):

public class AccUserRole
{
public long Id { get; set; }
public string RoleName { get; set; }
public List<AccAdGroup> Groups { get; set; }
public List<AccScreen> Screens { get; set; }
}

public class AccAdGroup
{
public long Id { get; set; }
public string AdIdent { get; set; }
public List<AccUserRole> Roles { get; set; }
}



public class AccScreen
{
public long Id { get; set; }
public string ScreenIdent { get; set; }
public List<AccUserRole> Roles { get; set; }
}

我想获取至少具有指定组列表(当前用户的组)之一的所有角色(包括它们的屏幕和组)。所以我使用了这个查询:

List<AccUserRole> userRoles = (from ur in db.AccUserRoles.Include("Groups").Include("Screens")
from g in ur.Groups
where user.Groups.Contains(g.AdIdent)
select ur).ToList();

它获得了正确的角色,但是 GroupsScreens 属性为空。看起来 EF 在使用 Include 和第二个 from 时遇到问题。任何有关如何包含属性或重写查询的帮助都将不胜感激。

最佳答案

预加载

这是因为您只指定了一个包含级别,而您的查询要求的是第二级别的内容。

您的 include 允许您请求 ur.Groupsur.Screens。下一个级别是 from g in ur.Groups,您还没有包括该级别。 (这可能出乎您的意料,因为您已经在查询的第一部分请求了所有 AccUserRoles。)

要使您的查询运行,您可以在开头添加另一个 .include,深入两层:

from ur in db.AccUserRoles
.Include("Groups")
.Include("Groups.Roles")
.Include("Screens")

如果您需要更上一层楼,只需添加另一个包含:

from ur in db.AccUserRoles
.Include("Groups")
.Include("Groups.Roles")
.Include("Groups.Roles.Groups")
.Include("Screens")

...等等

如果您要嵌套很多关卡,这可能会变得很麻烦,因此另一种方法是使用延迟加载,正如 Praval 'Shaun' Tirubeni 建议的那样,通过添加 virtual 关键字添加到您的实体中的集合。

关于c# - Entity Framework 为包含属性返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25764005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com