4

この種の関連付けでは、「タイプ 'Foo' と 'Bar' の間の関連付けのプリンシパル エンドを特定できません。この関連付けのプリンシパル エンドは、リレーションシップ fluent API またはデータ アノテーションのいずれかを使用して明示的に構成する必要があります。 "

public class Foo
{
    public int Id { get; set; }

    public int? MainBarId { get; set; }
    public virtual Bar MainBar { get; set; }

    [InverseProperty("Foo")]
    public virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
    public int Id { get; set; }

    public int FooId { get; set; }
    public virtual Foo Foo { get; set; }

    public int? OldFooId { get; set; }
    public virtual Foo OldFoo { get; set; }
}

ここで、Foo にはバーのコレクションがあり、メイン バー (MainBar) を持つことができます。Bar は常に Foo に関連付けられていましたが、別の Foo (OldFoo) への参照を持つことができました。

  1. データ注釈を使用してEFでこれをマップする方法は?
  2. データ注釈では不可能な場合、これを流暢に行う方法は?
4

1 に答える 1

7

[InverseProperty("Foo")]EF に、Bar.Fooとが 1 対多の関連付けでペアになっているプロパティであることを伝えることFoo.Barsで、それは明らかです。

次に、 と がFoo.MainBarありBar.OldFooます。EF は、これらがどのように関連しているかを知りません。それらは 1 対 1 の関連付けでペアにすることができます。つまり、反対側に「多数」の多重度を持つ、独立したものにすることもできます。だからあなたはEFに言わなければなりません。

プロパティは独立していると仮定します。つまり、 aは、これがであるという要件なしで を同時にBar持つことができます。次に、プロパティの 1 つに関する EF 情報を提供するだけで十分です。OldFooBarFooMainBar

modelBuilder.Entity<Bar>().HasOptional(f => f.OldFoo).WithMany()
    .HasForeignKey(f => f.OldFooId);

また

modelBuilder.Entity<Foo>().HasOptional(f => f.MainBar)
    .WithRequired(b => b.OldFoo)

関連付けのこれらの「1」端とペアになった逆のプロパティがないため、データ注釈でこれを行うことはできません (属性で装飾するプロパティはありません)。

于 2013-05-13T21:32:49.947 に答える