0

2つの簡単なクラスがあります

public class User
{
    public User()
    {
        Roles = new Collection<Role>();
    }
    public int UserId { get; set; }
    public string UserName { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class Role
{
    public Role()
    {
        Users = new Collection<User>();
    }

    public int RoleId { get; set; }
    public string RoleName { get; set; }
    public ICollection<User> Users { get; set; }
}

シードメソッドをオーバーライドして、次のデータをシードしました

        var firstUser = new User {UserName = "vivekr"};
        var secondUser = new User {UserName = "vivekm"};

        var firstRole = new Role {RoleName = "admin"};
        var secondRole = new Role {RoleName = "user"};

        firstUser.Roles.Add(firstRole);
        firstUser.Roles.Add(secondRole);

        secondUser.Roles.Add(firstRole);


        context.Users.Add(firstUser);
        context.Users.Add(secondUser);

マッピングは、OnModelCreating()をオーバーライドすることによって行われます。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>()
                .HasMany<Role>(r=> r.Roles)
                .WithMany(u => u.Users)
                .Map(c=>
                         {
                             c.MapLeftKey("UserId");
                             c.MapRightKey("RoleId");
                             c.ToTable("UserRoles");
                         });
        }

すべてのテーブルが正しく作成されており、値が正しいことがわかります(マッピングを含む)

しかし、私はデータをフェッチするときに問題があります

私がそうする場合(dbが私のContextクラスのインスタンスであると仮定して)

var selectedRoles = db.Users.Find(1).Roles;

selectedRolesの数を0にします。2になるはずです。なぜこれが起こっているのかわかりません。

4

1 に答える 1

0

Include() を使用する必要があります。include を使用すると、find は使用できなくなります。次のようなことを試してください:

db.Users.Include("Roles").FirstOrDefault(x => x.UserId == 1).Roles;

エンティティ フレームワークは、関連するオブジェクトを自動的に読み込みません。上記のように熱心にフェッチするか、遅延ロードを使用して、そうするように指示する必要があります。

これは、関連データを取り込むためのさまざまな手法を説明する優れた記事です。

于 2013-01-11T16:35:19.207 に答える