0

以下のようなエンティティがあります

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長さは常にゼロです。なぜ、どのように解決するのですか?

4

1 に答える 1

3

これは、Entity Framework の遅延読み込みが原因で発生しています。最初のステートメントでは、具体的にPermissionsプロパティを要求しています。これにより、Entity Framework はデータベースからそのテーブルを読み込むクエリを生成します。User2 番目のクエリでは、データベースからテーブルを読み込むように Entity Framework に要求しているだけHasPermissionですが、呼び出しているメソッドには、別のデータベース呼び出しを行ってPermissionsテーブルを読み込む方法がありません。

これは、Entity Framework を使用する場合の一般的な問題です。Include()これは、Entity Frameworkの拡張メソッドを使用して、2 番目のクエリで関連するテーブルを積極的に読み込むことで解決できます。User ur = db.User.Where(u => u.UserId == 1).Include(u => u.Role.Permissions).First();

于 2013-10-06T15:01:53.040 に答える