实体框架包含命令 - 左连接还是内连接?

Roy*_*mir 26 c# linq entity-framework .net-4.0 linqpad

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

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

如果它确实有导航道具 - 那么使用Include.(它还可以节省数据库命中率.)

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

Include实现为连接.根据所包含链接的可为空性,它是内部左侧连接.

题 :

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

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

为什么实体框架为我决定它是什么类型的连接?

编辑:可视化:

在此输入图像描述

在此输入图像描述

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

在此输入图像描述

这是改变:

在此输入图像描述

Hen*_*man 13

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

但是只要你的Db和模型中的约束匹配(即CityID INT NOT NULL),使用何种类型的Join就不重要了.这应该是正常情况.

没有约束,你当然会期望一个左连接.

  • 对我来说似乎很清楚和明显.尝试想象其他组合,esp Not Null和Left join - >无效对象. (2认同)

mad*_*nes 5

我知道这是一个古老的问题,但是如果有人使用我的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);
    }
Run Code Online (Sandbox Code Playgroud)

被翻译为左外连接,

    modelBuilder.Entity<Parent>()
        .HasRequired(a => a.Child) /* INNER JOIN */
        .WithMany()
        .HasForeignKey(a => a.ChildId);
Run Code Online (Sandbox Code Playgroud)

被翻译为INNER JOIN