33

当我调查 和 之间的区别时IncludeJoin我发现:

如果数据库包含外键 - 它没有导航道具,所以最好使用Join

如果它确实有导航道具 - 然后使用Include. (它还保存了一个分贝命中。)

但是这里的一个答案引起了我的注意:

Include 被实现为连接。根据所包含链接的可空性,它是连接或连接。

问题 :

无效性如何影响左/内连接?

在 Sql server 中,我可以有一个Cities表和Persons表,一个人可以有一个NULL CityID.

为什么实体框架为我决定它是哪种加入?

编辑:可视化:

在此处输入图像描述

在此处输入图像描述

现在让我们将 CityId 更改为 not null :

在此处输入图像描述

这是变化:

在此处输入图像描述

4

2 回答 2

15

假设在您的班级中有[Required]对 City 或 CityID 的约束。并假设有没有(有效)城市的人员记录。满足 的唯一方法[Required]是执行内部连接。

但只要您的 Db 和模型中的约束匹配(即CityID INT NOT NULL),使用哪种 Join 并不重要。这应该是正常情况。

如果没有约束,您当然会期望 Left Join。

于 2013-09-15T07:18:19.173 回答
13

我知道这是一个老问题,但如果其他人像我一样使用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

于 2017-10-09T17:22:11.697 回答