我有一个像下面这样的实体
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");
那么Permissions
中的HasPermission
列表的长度始终为零,为什么以及如何解决?
答案 0 :(得分:3)
这是因为实体框架延迟加载而发生的。在第一个语句中,您特意请求Permissions
属性,这会导致Entity Framework生成一个从数据库加载该表的查询。在第二个查询中,您只是要求Entity Framework从数据库加载User
表,但是您调用的HasPermission
方法无法进行另一个数据库调用来加载Permissions
} table。
使用Entity Framework时,这是一个常见问题。可以使用实体框架中的Include()
扩展方法来急切地加载第二个查询中的相关表格,即User ur = db.User.Where(u => u.UserId == 1).Include(u => u.Role.Permissions).First();