0

だから私はObjectAと呼ばれるクラスを手に入れました。それは多くのObjectsBを持ち、オブジェクトはそれらを識別するためにIdを持っていますが、言語も持っています(列挙型ですが、実際にはINTとして保存され、この場合も関係ありません)。

public class ObjectA
{
       public int Id {get;set;}
       public Language Language {get;set;}
       ... // and a list of objectA properties

       public virtual ICollection<ObjectB> ObjectBs {get;set;}
}

public class ObjectB
{
       public int Id {get;set;}
       public Language Language {get;set;}
       ... // and a list of objectB properties

       public ObjectA TheObjectA {get;set;}
}

今、私はそれらを両方とも主キーとしてマッピングする方法を学びました。これには流暢なAPIを使用します。[Key]属性と[Column]属性(私は使用していません)も使用できることを知っています。

modelBuilder.Entity<ObjectA>().HasKey(a => new {a.Id, a.Languague})
modelBuilder.Entity<ObjectB>().HasKey(a => new {a.Id, a.Languague})

今は色んなことをやってみましたが、つなげられないようです。誰かが私がこれを修正する方法を知っていますか?

4

1 に答える 1

2

1対多の関係にあるプリンシパル(ObjectA)に複合主キーがある場合、従属(ObjectB)にも同じ数の列で構成される外部キーが必要です。

関連するオブジェクトAとオブジェクトBは同じ言語でなければならないと思います。その場合ObjectB.Language、外部キーの最初の部分を作成できます。(これは、同時に主キーと外部キーの一部ですObjectB。)FKの2番目の部分をモデルのプロパティとして公開すると、次のようになります。

(私はあなたが交換しなければならないと信じていますIdLanguageそして以下が機能するために。)

public class ObjectA
{
    public Languague Languague {get;set;}
    public int Id {get;set;}
    ... // and a list of objectA properties

    public virtual ICollection<ObjectB> ObjectBs {get;set;}
}

public class ObjectB
{
    public Languague Languague {get;set;}
    public int Id {get;set;}
    ... // and a list of objectB properties

    public int TheObjectAId {get;set;}
    public ObjectA TheObjectA {get;set;}
}

そして、Fluent APIを使用したマッピング:

modelBuilder.Entity<ObjectA>().HasKey(a => new { a.Languague, a.Id })
modelBuilder.Entity<ObjectB>().HasKey(b => new { b.Languague, b.Id })

modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .HasForeignKey(b => new { b.Language, b.TheObjectAId });

言語が異なる可能性がある場合は、その言語に別のFKプロパティを導入します。

    public Language TheObjectALanguage {get;set;}
    public int TheObjectAId {get;set;}
    public ObjectA TheObjectA {get;set;}

...そして地図:

modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .HasForeignKey(b => new { b.TheObjectALanguage, b.TheObjectAId });

関係がオプションの場合は、FKプロパティをnull許容にするWithOptional代わりに使用します。WithRequired

public Language? TheObjectALanguage {get;set;}
public int? TheObjectAId {get;set;}

MapKeyFluentAPIで使用できるFKプロパティをモデルに含めたくない場合は次のようにします。

modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .Map(m => m.MapKey("TheObjectALanguage, TheObjectAId")); // FK columns
于 2012-09-12T21:02:04.473 に答える