实体框架核心2.1在左连接上抛出ArgumentException

Cou*_*ier 5 entity-framework entity-framework-core .net-core asp.net-core asp.net-core-2.0

我最近将我的项目从.NET Core 2.0升级到2.1.我使用Entity Framework Core并有几个包含左连接的LINQ表达式.以下代码是一个示例:

var tickets = (from ticket in dbContext.Tickets
               join member in dbContext.Members on ticket.MemberID equals member.ID into memberLEFT
               from member in memberLEFT.DefaultIfEmpty()
               join memberType in dbContext.MemberTypes on member.MemberTypeID equals memberType.ID into memberTypeLEFT
               from memberType in memberTypeLEFT.DefaultIfEmpty()
               select memberType)
              .ToList();
Run Code Online (Sandbox Code Playgroud)

如果是.NET Core 2.0,则该行无异常执行.在.NET Core 2.1中,它抛出以下ArgumentException:

System.ArgumentException:'Field'Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor + TransparentIdentifier`2 [Microsoft.EntityFrameworkCore.Storage.ValueBuffer,System.Collections.Generic.IEnumerable`1 [Microsoft.EntityFrameworkCore.Storage.ValueBuffer]].Inner'is未定义类型'Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor + TransparentIdentifier`2 [Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer]''

如果我更改LINQ以执行内连接而不是左连接,那么它执行没有问题.连接需要保留连接,所以我不能只更新我的所有代码来进行内连接.

有谁知道为什么EF Core 2.1现在在执行左连接时抛出ArgumentExecptions,以及如何解决这个问题?

Mo *_*d A 6

工具>选项检查Enable Just My code

在此处输入图片说明

  • @RobertPerry 是,首先出现错误的原因是您正在调试 EfCore 内部库。你禁用它,你会得到与你的相关的错误。加上这是一个 EfCore 内部错误,他们将在 3.0 版中解决 (2认同)

小智 2

我不确定为什么您自己创建联接而不是使用 EF 关系模型。我采用了你的例子并做了一些修改。

楷模:

public class Ticket
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength(200)]
    public string Description { get; set; }

    public int? MemberID { get; set; }

    [ForeignKey(nameof(MemberID))]
    public Member Member { get; set; }
}

public class Member
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength(200)]
    public string Description { get; set; }

    public int? MemberTypeID { get; set; }

    public ICollection<Ticket> Tickets { get; set; }
    [ForeignKey(nameof(MemberTypeID))]
    public MemberType MemberType { get; set; }
}

public class MemberType
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength(200)]
    public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

要定义外连接,只需使外键可为空即可。

当您像这样创建模型时,您只需在查询中包含属性即可:

Tickets = (from t in _dbContext.Tickets
              .Include(t => t.Member)
                  .ThenInclude(m => m.MemberType)
            select t).ToList();
Run Code Online (Sandbox Code Playgroud)

生成的sql如下所示:

SELECT [t].[ID], [t].[Description], [t].[MemberID], [t.Member].[ID], [t.Member]. 
    [Description], [t.Member].[MemberTypeID], [t.Member.MemberType].[ID], 
    [t.Member.MemberType].[Description]
FROM [Tickets] AS [t]
LEFT JOIN [Members] AS [t.Member] ON [t].[MemberID] = [t.Member].[ID]
LEFT JOIN [MemberTypes] AS [t.Member.MemberType] ON [t.Member].[MemberTypeID] = 
    [t.Member.MemberType].[ID]
Run Code Online (Sandbox Code Playgroud)

希望对您的问题有所帮助。