Include
とJoin
の違いを調査していたところ、次のことがわかりました。
DBが外部キーを含まない場合-ナビゲーションプロップがないため、Join
を使用することをお勧めします
Itdoeshas a navigation props-then use Include
。 (また、dbヒットを保存します。)
しかし、1つ answer here が私の注意を引いた:
インクルードは結合として実装されます。 含まれているリンクのnullabilityに応じて、innerまたはleft結合します。
質問:
Nullは左/内部結合にどのように影響しますか?
SQLサーバーでは、Cities
テーブルとPersons
テーブルを作成でき、人はNULL
CityID
を作成できます。
なぜEntity Frameworkは、どのような種類の結合であるかを判断しますか?
次に、CityIdをnull以外に変更します。
そしてここに変更があります:
クラスで、CityまたはCityIDに[Required]
制約があるとします。また、(有効な)CityのないPersonレコードがあるとします。 [Required]
を満たす唯一の方法は、内部結合を実行することです。
ただし、データベースとモデルの制約が一致する限り(つまり、CityID INT NOT NULL
)、どの種類の結合が使用されるかは実際には問題になりません。これは通常のケースです。
そして制約がなければ、もちろん左結合を期待するでしょう。
私はこれが古い質問であることを知っていますが、誰かがEF Code Firstを使用してここに着陸した場合、私の問題は流暢なマッピングにありました:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Parent>()
.HasOptional(a => a.Child) /* LEFT OUTER JOIN */
.WithMany()
.HasForeignKey(a => a.ChildId);
}
LEFT OUTER JOINとして変換されますが、
modelBuilder.Entity<Parent>()
.HasRequired(a => a.Child) /* INNER JOIN */
.WithMany()
.HasForeignKey(a => a.ChildId);
INNER JOINとして変換されます。