繁体   English   中英

模型中的EF访问导航属性

[英]EF access navigation properties in model

我有一个像下面这样的实体

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");

那么HasPermissionPermissions列表始终为零,为什么以及如何解决?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM