【问题标题】:EF7 generating incorrect sql with optional relationshipsEF7 生成具有可选关系的不正确 sql
【发布时间】:2016-04-07 03:31:06
【问题描述】:

考虑以下模型:

public class News
{
    public int Id { get; set; }
    public string Title { get; set; }

    public Branch Branch { get; set; }
    public int? BranchId { get; set; }
}

public class NewsDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public BranchDto Branch { get; set; }
}

public class Branch
{
    public int Id { get; set; }
    public string Name { get; set; }

    public List<News> News { get; set; } = new List<News>();
}

public class BranchDto
{
    public int Id { get; set; }
    public string Name { get; set; }
}

这里我们在News 和Branch 之间有一个可选的关系(一对多)。

我们发出以下查询:

context.News
    .Select(dto => new NewsDto()
    {
        Id = dto.Id,
        Title = dto.Title,
        Branch = dto.Branch == null ? null : new BranchDto()
        {
            Id = dto.Branch.Id,
            Name = dto.Branch.Name
        }
    }).ToList();

EF6

生成的查询是:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Title] AS [Title], 
CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
[Extent1].[BranchId] AS [BranchId], 
[Extent2].[Name] AS [Name]
FROM  [dbo].[News] AS [Extent1]
LEFT OUTER JOIN [dbo].[Branches] AS [Extent2] ON [Extent1].[BranchId] = [Extent2].[Id]

它应该是这样的:CASE WHEN 之后的左外连接来处理对 Branches 表的空引用。

EF7 (RC1)

生成相同的查询:

SELECT
[dto].[Id],
[dto].[Title],
[dto].[BranchId] IS NULL,
[dto].[BranchId],
[dto.Branch].[Name]
FROM [News] AS [dto]
INNER JOIN [Branch] AS [dto.Branch] ON [dto].[BranchId] = [dto.Branch].[Id]

我真的不明白为什么会这样。这种关系显然是可选的,所以内部连接是完全错误的。除此之外,[dto].[BranchId] IS NULL 行给出了System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'IS',所以我猜这甚至不是有效的 sql。

仅当关系是可选的时才会发生这种情况。怎么回事?

【问题讨论】:

  • 这里要达到什么目的[dto].[BranchId] IS NULL
  • 这一行不是我写的,这是ef7自己生成的。是的,看起来它是无效的 sql。
  • 您尝试过最新的 (RC2) 位吗?
  • Word 是 ef 家伙尚未实现外连接。他们首先试图解决一些复杂问题。我不确定这是否已经解决,我没有时间尝试最新的位。

标签: asp.net sql-server entity-framework-core


【解决方案1】:

所以我相信这与issue #3186 有关。 EF 团队认为这是一个高优先级错误,应该在RC2 中修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多