我在EF Code First中有以下型号:
public class A
{
public int Id { get; set; }
public virtual B { get; set; }
}
public class B
{
public int Id { get; set; }
public virtual A { get; set; }
}
我已将关系定义如下:
modelBuilder.Entity<A>().HasKey(entity => entity.Id);
modelBuilder.Entity<B>().HasKey(entity => entity.Id);
modelBuilder.Entity<A>()
.HasOptional(entity => entity.B)
.WithRequired(entity => entity.A);
当我写下面的查询时:
var a = db.AItems.Include("B");
生成的查询如下:
SELECT
[Extent1].[Id] AS [Id],
[Extent3].[Id] AS [Id1]
FROM [dbo].[As] AS [Extent1]
LEFT OUTER JOIN [dbo].[Bs] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
LEFT OUTER JOIN [dbo].[Bs] AS [Extent3] ON [Extent2].[Id] = [Extent3].[Id]
为什么Entity Framework对这种关系有一个额外的(无用的)左连接?
答案 0 :(得分:2)
首先欢迎充满惊喜的实体框架的令人兴奋的世界(!)。我以前遇到过这种情况;当您具有一对一关系时,即使您没有明确包含相关实体,实体框架也会创建一个连接语句。 在您的情况下,首先从include语句加入结果,默认情况下添加另一个左外连接。您可以通过删除include语句并观察包含左外连接语句的sql输出来检查这一点。