1

現在1対多の関係を設定する必要があります:

public class Foo
{
    public int FooId { get; set; }
    public int? BarId { get; set; }
    ...
    public virtual Bar Bar { get; set; }
}

public class Bar
{
    public int BarId { get; set; }
    ...
    public virtual ICollection<Foo> Foos { get; set; }
}

public FooMap()
{
    HasKey(e => e.FooId);
    Property(e => e.FooId.IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    Property(e => e.BarId).IsOptional();
    ...
    HasOptional(e => e.Bar).WithMany(Foos).HasForeignKey(e => e.BarId);
}

public BarMap()
{
    HasKey(e => e.BarId);
    Property(e => e.BarId.IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    ...
    HasMany(e => e.Foos).WithOptional(e => e.Bar).HasForeignKey(e => e.BarId);
}

ただし、実際には、Bar は 1 つの Foo にしか割り当てることができません。これを設定して、Foos のコレクションではなく、Bar に 1 つの Foo ナビゲーション プロパティを設定することはできますか? 私はまだテーブルをレンダリングしたい:

Foos
- FooId
- BarId (null)
- ...

Bars
- BarId
- ...

クラスを次のようにしたい:

Foo
- FooId
- BarId
- ...
- Bar

Bar
- BarId
- ...
- Foo

WithOptionalDependant と WithOptionalPrincipal をいじっていますが、正しい組み合わせが見つかりません。どんな助けでも大歓迎です!

4

1 に答える 1

1

オプションの 1 : 1 アソシエーションをモデル化する一般的な方法は (in FooMap)

HasOptional(f => f.Bar).WithRequired(b => b.Foo);

しかし、それはあなたが望むモデルを生成しません。は への主キーと外部キーの両方であるFoo.BarIdため、は必要ありません。Bar.BarIdFoo.FooId

必要に応じてFoo.BarId、FK アソシエーションで 1 回だけ使用されるように一意の制約を設定する必要があります。したがって、すでに使用可能な一意のフィールドである主キーを使用することもできます。

編集

アソシエーションの両側をオプションにしたいというのは明確ではありませんでした。あなたは(で)によってそれを達成することができますBarMap

HasOptional(b => b.Foo).WithOptionalPrincipal(f => f.Bar)
                       .Map(m => m.MapKey("BarId"));

これにより、投稿で示したデータ モデルが表示されます。

于 2013-04-03T18:19:38.213 に答える