5

Code First (EF 4.3) でモデル化したい、このようなドメイン クラスがいくつかあります。

public class Foo {
    // ...
}

public class Bar {
    // ...

    public Foo Foo { get; set; }
}

public class Baz {
    // ...

    public Foo Foo { get; set; }
}

ただし、私が目にするすべてのでは、外部オブジェクト参照がFooクラスに追加されています。私のクラスはandクラスFooにとらわれないことができますか、それとも本当にこのようなことをする必要がありますか?BarBaz

public class Foo {
    // ...
    public virtual Bar { get; set; }

    public virtual Baz { get; set; }
}

この回答によると、クラスにはナビゲーション プロパティが必要です私はCode Firstの初心者なので、なぜこれが当てはまるのか誰か説明できますか? FooFluent API を使用して、このようなクラスの汚染を回避する方法はありますか?

Fooそれを使用するすべてのクラスについて知る必要があるのは奇妙に思えます。私の設計は何らかの形で根本的に欠陥があるのでしょうか?

4

2 に答える 2

2

ここでの問題は、1対1の関係の要件になります。EF の 1 対 1 の関係は、主キーを介してマップされます。プリンシパル エンティティを選択すると、依存エンティティはその PK に FK を持つ必要があります。関連付けるには、同じ PK 値を持つ必要があります。理由は、一意のキーがサポートされていないためです。

この制限を受け入れると、モデルを使用して次のようにマップできます。

modelBuilder.Entity<Bar>()
            .HasRequired(b => b.Foo)
            .WithOptional();

modelBuilder.Entity<Baz>()
            .HasRequired(b => b.Foo)
            .WithOptional();
于 2012-08-22T19:51:10.253 に答える
1

他の答えは部分的に正しいです。

テーブル間のリレーションシップを使用してデータベース モデルをブートストラップするように code-forst を使用する場合は、少なくとも 1 つのクラスでナビゲーション プロパティを定義する必要があります。

もちろん、マッピングは関係がなくても機能しますが、データベース/SQL レベルでの制約はありません。移行または他のSQLスクリプトでそれらを追加しない限り。

あなたの例では、とにかく定義しようとしている関係の種類がよくわかりません。それは一対一の関係であるはずですか?

その場合、リンクされた質問で回答されているように、Foo はそれへの参照を持つ他のクラスについて知る必要はありません。それを持つ必要があるのは1 つのクラスだけです。

于 2012-08-22T18:33:24.870 に答える