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,以及如何解决这个问题?
从工具>选项检查Enable Just My code
小智 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)
希望对您的问题有所帮助。
归档时间: |
|
查看次数: |
1956 次 |
最近记录: |