web-dev-qa-db-ja.com

エンティティフレームワークインクルードコマンド-左結合または内部結合?

IncludeJoinの違いを調査していたところ、次のことがわかりました。

DBが外部キーを含まない場合-ナビゲーションプロップがないため、Joinを使用することをお勧めします

Itdoeshas a navigation props-then use Include。 (また、dbヒットを保存します。)

しかし、1つ answer here が私の注意を引いた:

インクルードは結合として実装されます。 含まれているリンクのnullabilityに応じて、innerまたはleft結合します。

質問:

Nullは左/内部結合にどのように影響しますか?

SQLサーバーでは、CitiesテーブルとPersonsテーブルを作成でき、人はNULLCityIDを作成できます。

なぜEntity Frameworkは、どのような種類の結合であるかを判断しますか?

編集:視覚化:

enter image description here

enter image description here

次に、CityIdをnull以外に変更します。

enter image description here

そしてここに変更があります:

enter image description here

27
Royi Namir

クラスで、CityまたはCityIDに[Required]制約があるとします。また、(有効な)CityのないPersonレコードがあるとします。 [Required]を満たす唯一の方法は、内部結合を実行することです。

ただし、データベースとモデルの制約が一致する限り(つまり、CityID INT NOT NULL)、どの種類の結合が使用されるかは実際には問題になりません。これは通常のケースです。

そして制約がなければ、もちろん左結合を期待するでしょう。

13
Henk Holterman

私はこれが古い質問であることを知っていますが、誰かが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として変換されます。

5
madannes