代码之家  ›  专栏  ›  技术社区  ›  Ristogod

之后,立即加载“类型之间未定义强制运算符”。NET Core/EF Core 2.0升级

  •  3
  • Ristogod  · 技术社区  · 8 年前

    在里面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和;EF Core 2.0中,该方法引发此异常:

    系统发生InvalidOperationException:在类型“PaperPointerRecord”和“PaperRecord”之间未定义强制运算符。

    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 回复  |  直到 8 年前
        1
  •  2
  •   Moho    8 年前

    Include 在这种情况下没有用处,因为您返回的是投影和 包括 s被忽略(阅读关于忽略的内容包括 here ).

    record.PaperRecord.Paper 要有价值,只需将其包含在您的投影中;EF将建立关系。

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