web-dev-qa-db-ja.com

Entity Framework 4.3コードは、最初に同じテーブルを使用して多対多のコードを作成します

私は次のようなモデルを持っています

public class User
{
    [Key]
    public long UserId { get; set; }

    [Required]
    public String Nickname { get; set; }

    public virtual ICollection<Town> Residencies { get; set; }

    public virtual ICollection<Town> Mayorships { get; set; }
}

そして

public class Town
{
    [Key]
    public long TownId { get; set; }

    [Required]
    public String Name { get; set; }

    public virtual ICollection<User> Residents { get; set; }
    public virtual ICollection<User> Mayors { get; set; }
}

EFが自動的に作成されたTownResidentsテーブルとTownMayorsテーブルを使用して2つの多対多の関係を作成することを望んでいました。この結果を得るために必要な規則や明示的な注釈が見つからないようです。

代わりに、Townテーブルに2つのFK UserIdを取得し、Userテーブルに2つのFKTownIdを取得しています。

EFに2つの多対多の関係でこれらを表示させる方法はありますか?

ありがとう

31
Sean

EFには、User.ResidenciesTown.Residentsがナビゲーションプロパティのペアを形成し、User.MayorshipsTown.Mayorsが2番目のペアを形成することを(おそらく)特定するために必要な、ある種の単語と文法の認識アルゴリズムがありません。したがって、four 1対多の関係があり、4つのナビゲーションプロパティのそれぞれが関係の1つに属していることを前提としています。 (これが、データベーステーブルに表示される4つの外部キーの理由です。)

この標準的な仮定はあなたが望むものではないので、この標準的な規則を上書きするには、関係を明示的に定義する必要があります。

データ注釈付き:

public class User
{
    [Key]
    public long UserId { get; set; }

    [Required]
    public String Nickname { get; set; }

    [InverseProperty("Residents")]
    public virtual ICollection<Town> Residencies { get; set; }

    [InverseProperty("Mayors")]
    public virtual ICollection<Town> Mayorships { get; set; }
}

またはFluentAPIを使用する場合:

modelBuilder.Entity<User>()
    .HasMany(u => u.Residencies)
    .WithMany(t => t.Residents)
    .Map(x =>
    {
        x.MapLeftKey("UserId");
        x.MapRightKey("TownId");
        x.ToTable("TownResidents");
    });

modelBuilder.Entity<User>()
    .HasMany(u => u.Mayorships)
    .WithMany(t => t.Mayors)
    .Map(x =>
    {
        x.MapLeftKey("UserId");
        x.MapRightKey("TownId");
        x.ToTable("TownMayors");
    });

Fluent APIには、リンクテーブルの名前(およびキー列名も)を制御できるという利点があります。これらの名前をデータ注釈で定義することはできません。

31
Slauma