渴望加载"类型之间没有定义强制算子"在.NET Core / EF Core 2.0升级之后

时间:2017-09-20 13:34:44

标签: c# linq .net-core entity-framework-core eager-loading

在.NET Core 1.x中,我们有一个看起来像这样的方法:

public async Task<(PaperRecord Component, PaperPointerRecord Pointer)> GetOneAsync(DbSet<PaperPointerRecord> paperPointerRecords,
                                                                                   int? paperId = null,
                                                                                   long? externalPaperId = null,
                                                                                   Expression<Func<PaperPointerRecord, bool>> filter = null)
{
    var query = filter is null ? paperPointerRecords.AsQueryable() : paperPointerRecords.Where(filter);

    if (paperId.HasValue)
        query = query.Where(_ => _.PaperPointerId == paperId);

    if (externalPaperId.HasValue)
        query = query.Where(_ => _.ExternalId == externalPaperId);

    var record = await query.Include(_ => _.Paper)
                            .ThenInclude(_ => _.PaperColors)
                            .Select(_ => new
                                         {
                                             PaperRecord = _.Paper,
                                             PaperPointerRecord = _
                                         })
                            .SingleOrDefaultAsync();

    return !(record is null) ? (record.PaperRecord, record.PaperPointerRecord) : throw NewPaperRecordNotFoundException(paperId, externalPaperId);
}

这对我们很有用。将整个项目升级到.NET Core 2.0&amp; EF Core 2.0,该方法抛出此异常:

  

发生了System.InvalidOperationException:在类型&#39; PaperPointerRecord&#39;之间没有定义强制运算符。和PaperRecord&#39;。

此块中出现此异常:

var record = await query.Include(_ => _.Paper)
                        .ThenInclude(_ => _.PaperColors)
                        .Select(_ => new
                                     {
                                         PaperRecord = _.Paper,
                                         PaperPointerRecord = _
                                     })
                        .SingleOrDefaultAsync();

如果我删除了急切的加载并使其像这样,那么错误消失了,但我也没有得到预期的结果:

var record = await query.Select(_ => new
                                     {
                                         PaperRecord = _.Paper,
                                         PaperPointerRecord = _
                                     })
                        .SingleOrDefaultAsync();

我已经检查了Microsoft Documentation,我没有看到任何显示在那里的内容,表明我们在急切加载时做错了。

1 个答案:

答案 0 :(得分:2)

Include在这种情况下并不实用,因为您要返回投影并忽略Include(读取有关忽略的内容包括here)。

如果通过&#34;预期结果&#34;你的意思是你希望record.PaperRecord.Paper有一个值,只需将它包含在你的投影中; EF将把这段关系联系起来。

new
{
    PaperRecord = _.Paper,
    PaperPointerRecord = _,
    PaperColor = _.Paper.PaperColor,
}