EF 访问模型中的导航属性

本文关键字:导航 属性 访问 模型 EF | 更新日期: 2023-09-27 18:34:03

>我有一个如下所示的实体

public class Role
{
    [Key, Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required, StringLength(30)]
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
    public virtual ICollection<RolePermission> Permissions { get; set; }
    public bool HasPermission(String code)
    {
        foreach (var p in this.Permissions)
        {
            if (p.Permission.Code.Equals(code))
                return true;
        }
        return false;
    }
}

在控制器中,此代码运行良好:

for (var p in db.User.Where(u => u.UserId == 1).First().Role.Permissions) { PrintToDebug(); }

但:

User ur = db.User.Where(u => u.UserId == 1).First();
ur.Role.HasPermission("Some_Code_Were_Defined");

那么HasPermission中的Permissions列表总是长度为零,为什么以及如何解决?

EF 访问模型中的导航属性

这是由于实体框架延迟加载而发生的。 在第一个语句中,您专门请求 Permissions 属性,这会导致实体框架生成从数据库加载该表的查询。 在第二个查询中,您只要求实体框架从数据库加载User表,但您调用的HasPermission方法无法进行另一个数据库调用来加载Permissions表。

这是使用实体框架时的常见问题。 可以通过使用实体框架中的 Include() 扩展方法来在第二个查询中急切地加载相关表来解决,即 User ur = db.User.Where(u => u.UserId == 1).Include(u => u.Role.Permissions).First();