0

私はASP.NET 5(dnx46)RC1を持っています Microsoft.AspNet.IdentityのIdentityUserクラスから継承するUserクラスがあります。 2.1):Entity Framework 6.1.3ナビゲーションプロパティは、関連テーブルへのクエリの後に値を持ちます

私のDbContextでは、私は、関係規定されていOnModelCreating:JOIため

[Table("Roles")] 
public class Role : IdentityRole<int>, IBaseEntity, ISecureEntity 
{ 
    // Entity Framework Constructor 
    private Role() 
    { 

    } 
    public Role(string name) 
    { 
     Name = name; 
    } 

    public override int Id { get; set; } 

    public new string Name { get; set; } 

    public new virtual ICollection<UserRole> Users { get; set; } 
    public bool IsDeleted { get; set; } 
} 

とのUserRoleクラス:

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithRequired(ur => ur.User) 
      .HasForeignKey(ur => ur.UserId); 
[Table("Users")] 
public class User : BaseUser, IBaseUser 
{ 
// Entity Framework Constructor 
private User() 
{ 

} 

public User(string userName) 
    :base(userName) 
{ 

} 
[Key] 
public override int Id { get; set; } 

public bool IsDeleted { get; set; } = false; 

public new virtual ICollection<UserRole> Roles { get; set; } = new List<UserRole>(); 
} 

と役割のクラスをn個のテーブル:

public class UserRole : IdentityUserRole<int>, IBaseEntity 
{ 
// Entity Framework Constructor 
private UserRole() 
{ 

} 

public UserRole(int userId, int roleId) 
{ 
    UserId = userId; 
    RoleId = roleId; 
} 
public new int UserId { get; set; } 
public new int RoleId { get; set; } 

public User User { get; set; } 
public Role Role { get; set; } 

確かに、私はまた、明示的に私のDbContext CTORで遅延読み込みを有効にしている: は真= Configuration.LazyLoadingEnabled。 Configuration.ProxyCreationEnabled = true;

私はこのハックをしなければならない:

// HACK: Check if Roles is empty on user too when updating to EF7, else remove these lines 
// Lazy loading hack to get the Roles list for currentUser, seems just querying the UsersRoles table fills the roles 
var user2 = currentUser; 
var userRoles = await _userRoleRepository.GetAsync(r => r.UserId == user2.Id); 
/* END HACK */ 

はその後currentUser.Rolesナビゲーションプロパティは、突然すべての役割を持っています。だから、UsersRolesテーブルへのクエリは、何らかの形で、Userクラスのインスタンスのナビゲーションプロパティを埋め込んでいるようですね??

テーブルにクエリを実行したときにどのように動作するのか説明できる人はいますか?余計なことは何ですか? さらに重要なのは、その不必要な文を使わずにナビゲーションプロパティを動作させるにはどうすればいいですか?

答えて

1

これはちょっと前のことですが、これを追跡するのに時間がかかりました。

プライベートコンストラクタは使用しないでください。それらを保護させる。

EFは、モデルを拡張してナビゲーションプロパティを設定するプロキシオブジェクトを作成する必要があります。デフォルトのコンストラクタがprivateの場合、プロキシは作成されません。モデルを作成するだけです。

これを回避する別の方法として、すべてのクエリでインクルードステートメントを使用することをお勧めします。あなたがcontext.Users.Include(x => x.UserRoles)と言うなら、それはうまくいくでしょう。ただし、ナビゲーションプロパティはインクルードのレベルで停止します。これを維持しようとすると悪夢になる可能性があります。追加のナビゲーションプロパティが必要な場合は、常にクエリを編集しています。このアプローチの素晴らしい点の1つは、プライベートコンストラクタを保持し、他の領域に頭痛を引き起こす可能性のあるプロキシオブジェクトを持たないことです。

+0

ありがとう、これは確かに解決策です。私は私の空のctorのすべてを保護する:) – AppSum

関連する問題