0

Foo ごとに正確に 1 つの Bar があるいくつかのオブジェクトを格納したいと考えています。

次のような POCO オブジェクトがいくつかあります。

public class Foo
{
    public int Id { get; set; }
    public string FooProperty { get; set; }
    public int BarId { get; set; }
    public virtual Bar Bar { get; set; }
}
public class Bar
{
    public int Id { get; set; }
    public string BarProperty { get; set; }
    public int FooId { get; set; }
    public virtual Foo Foo { get; set; }
}

Foo と Bar は 1:1 の関係にあり、私が行った読み取りに基づいて、DbContext クラスで次のことを試しました。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

    modelBuilder.Entity<Foo>()
                   .HasRequired(x => x.Bar)
                   .WithRequiredPrincipal(x => x.Foo);

    base.OnModelCreating(modelBuilder);
}

バッキング ストアは SQL Server であり、これにより実際に 1 対 1 の関係を持つテーブルが作成されます。ただしBar、からへの FK 関係は両方のテーブルFooのフィールドにありますが、テーブルのフィールドからテーブルのフィールドへの関係Idであると予想されます。FooIdBarIdFoo

EF は、両方のテーブルの PK (Id) フィールドの同期を維持することを決定したようで、基本的にBarId/FooId列を無視しています。

私は何を間違っていますか?

4

1 に答える 1

3

1 対 1 の関係でよろしいですか? すべての foo に 1 つのバーがあり、すべてのバーに 1 つの foo がある場合、EF はリレーションシップに主キーを使用しますが、おそらく使用する必要があります。1 対多または 1 対 0..1 の関係を望んでいませんか?

Foo に多くのバーを持たせたい場合は、流暢に変更できる FK を定義できます。

  modelBuilder.Entity<Foo>()
                .HasRequired(x => x.Bar)
                .WithMany()
                .HasForeignKey(f => f.BarId);

これは、役立つかもしれない一対一の外部キー関係に関するブログ投稿です

于 2012-08-06T16:14:20.377 に答える