3

Entity Framework 4.3 Code-First と Migrations を使用する ASP.NET MVC3 アプリケーションがあります。

同じタイプのエンティティ間に多対多の関係を作成しようとしてきましたが、マイグレーションを使用してマイグレーションをスキャフォールディングすると、1 対 1 の関係が生成されます。

アイデアは、1 人のユーザーが他の複数のユーザーをフォローできるようにすることです (Twitter を考えてみてください)。

私のUserモデルは次のようになります。

public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public DateTime Registered { get; set; }
    ...
    public virtual ICollection<User> Follows { get; set; }
}

追加された Follows プロパティをスキャフォールディングすると、次のような移行が得られます。

public partial class FollowUser : DbMigration
{
    public override void Up()
    {
        AddColumn("User", "User_UserId", c => c.Int());
        AddForeignKey("User", "User_UserId", "User", "UserId");
        CreateIndex("User", "User_UserId");
    }

    ...
}

したがって、Entity Framework は、私のモデルを 2 人のユーザー間の 1 対 1 の関係として解釈します。

同じタイプのエンティティ間に多対多の関係を作成するにはどうすればよいですか?

4

1 に答える 1

14

これは多対多の自己結合関係であるため、 User エンティティには TypeのFollowersとプロパティの両方が必要です。クラスを変更して、それらを含めるようにしましょうFollowingUser

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }       
    public virtual ICollection<User> Followers { get; set; }
    public virtual ICollection<User> Following { get; set; }
}

DbContext クラスを更新して、Users を返すプロパティを持つようにします。

 public DbSet<User> Users { set; get; }

これら 2 つの間に多対多のリレーションシップが必要であることを EntityFramework に伝える必要があります。OnModelCreatingメソッドをオーバーライドして、Fluent APIでそれを行いましょう

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().HasMany(m => m.Followers).WithMany(p => p.Following).Map(w => w.ToTable("User_Follow").MapLeftKey("UserId").MapRightKey("FollowerID"));
    base.OnModelCreating(modelBuilder);
}

これで、Entity Framework はこのようなテーブルを作成します。

ここに画像の説明を入力

UserIdFollowerIdを Forign Key 列名として使用するように Entity Framework に明示的に指示したことに注意してください。それについて言及していない場合、EF は列名としてUser_IDandを使用します。User_ID1

于 2012-05-02T21:45:11.520 に答える