2012-08-22 26 views
5

私はコードファースト(EF 4.3)でモデル化したい、このようないくつかのドメインクラスを持っています。コードファーストクラスにはナビゲーションプロパティが必要なのはなぜですか?

public class Foo { 
    // ... 
} 

public class Bar { 
    // ... 

    public Foo Foo { get; set; } 
} 

public class Baz { 
    // ... 

    public Foo Foo { get; set; } 
} 

は私も見あらゆるexampleでは、外国人のオブジェクト参照は、Fooクラスに追加されます。私のFooクラスは、BarBazクラスにとらわれないのですか?それとも本当にこのようなことをする必要がありますか?

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

    public virtual Baz { get; set; } 
} 

this answerによると、クラスは、ナビゲーションプロパティを持つ必要性を行います。私はコードファーストで初めてです。だから誰もこの事件の理由を説明できますか? Fluent APIを使用してFooクラスを汚染しないようにする方法はありますか?

Fooは、それを使用するすべてのクラスについて知っておく必要があります。私のデザインは根本的に何らかの欠陥がありますか?

答えて

1

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

データベースモデルをブートストラップするには、テーブル間の関係がの場合、少なくとも1つのクラスにナビゲーションプロパティを定義する必要があります。

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

あなたの例では、どういうふうに関係を定義しようとしているのかはよく分かりませんが、それは1対1の関係になっていますか?

この場合、Fooは、リンクされた質問に答えたように、他のどのクラスについても知る必要はありません。の1つだけがクラスにある必要があります。

+0

おかげで、これは私の誤解を明らかにしました。私は急いで、他の答えを 'Foo'がナビゲーションプロパティを持たなければならないと誤解しました。 – Eric

2

ここでの問題は、1対1の関係になります。 EFの一対一の関係は主キーを介してマッピングされます。プリンシパルエンティティを選択し、従属エンティティはPK上にFKを持っていなければなりません。関連するPK値は同じでなければなりません。その理由は、一意のキーのサポートが欠落しているためです。あなたはこの制限を受け入れると

あなたは、単にそれが好きなあなたのモデルを使用してマッピングすることができます:

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

modelBuilder.Entity<Baz>() 
      .HasRequired(b => b.Foo) 
      .WithOptional(); 
+0

これは非常に便利です、ありがとう。 – Eric

関連する問題