Entity Framework .NET Core returns 'Data is Null. This method or property cannot be called on Null values.' 但不在调试器中

Entity Framework .NET Core returns 'Data is Null. This method or property cannot be called on Null values.' but not in Debugger

问题:

在 C# 上,MVC API with Angular IIS 部署解决方案上的 6 个前端。

一个简单的 HTML table 在特定列上具有 8 个过滤字段,通过 API HttpGet 调用在后端运行查询。该函数本身工作正常,但 NOT 用于特定字符串。例如在字段'Description'上,后端returns 'Data is Null. This method or property cannot be called on Null values'当使用以下字符串时。值在前端和后端之间正确传递,API 调用主要是 return 适当的数据。

然而,诸如 app 和比 app 更长的字符串,例如 applicationcert 和更长的字符串,例如 certificate 将 return 'Data is Null' 错误。

如果我使用 f 作为 transmittal 的输入,我会得到 'Data is Null' 错误。 但是,如果我在 document 上使用 crc 并且 THEN 使用 f 作为 transmittal 函数 returns 的输入正常数据??

只有在部署状态下才会出现,调试代码时不会出现这个问题。调试时,代码 return 符合预期结果并始终产生正确的响应。

服务调用使用一组 'chained' where 语句来构建 IQueryable,该 IQueryable 被调用到序列末尾的 return a .ToListAsync()


使用:


控制器代码

[HttpGet("[action]")]
public async Task<IActionResult> Search(string TR, string DA, string DO, string RE, string TY, string DD, string DI, string OR, string DE)
        {
        return Ok(await _archiveService.Search(TR, DA, DO, RE, TY, DD, DI, OR, DE));
        }

ArchiveService 代码

public async Task<IEnumerable<object>> Search(
            string transmittal,
            string date,
            string document, 
            string revision,
            string type,
            string description, 
            string discipline, 
            string origin, 
            string destination)
        {
                var result = _db.TblCorrespondenceLog.AsQueryable();

                if (!string.IsNullOrEmpty(transmittal))
                    result = result.Where(f => f.TransmittalNo.Contains(transmittal));

                if (!string.IsNullOrEmpty(date))
                {

                }

                if (!string.IsNullOrEmpty(document))
                    result = result.Where(f => f.CompanyDocumentNo.ToLower().Contains(document));

                if (!string.IsNullOrEmpty(type))
                    result = result.Where(f => f.DocumentType.ToLower() == type);

                if (!string.IsNullOrEmpty(description))
                    result = result.Where(f => f.DocumentDescription.ToLower().Contains(description));

                if (!string.IsNullOrEmpty(discipline))
                    result = result.Where(f => f.Discipline.ToLower() == discipline);

                if (!string.IsNullOrEmpty(origin))
                    result = result.Where(f => f.OriginatorCode.ToLower() == origin);

                if (!string.IsNullOrEmpty(destination))
                    result = result.Where(f => f.SupplierCode.ToLower() == destination);    

                return await result.ToListAsync();
}

给出错误的字段是具有 .Contains() 子句的字段

当我使用 SQL writer 获取被触发到服务器的查询时,我得到以下查询,这会在 .ToListAsync() 被调用时导致 'Data is Null' 错误:

SELECT [f].[uID], [f].[Action_Required], [f].[Approved_Responded], [f].[Area_Code], [f].[Company_Document_No], 
[f].[Discipline], [f].[Document_Description], [f].[Document_Type], [f].[fileUID], [f].[Link], [f].[Originator_Code], 
[f].[Reference_Document], [f].[ResponsibelEngineer], [f].[ResubDate], [f].[ResubTransmittal], [f].[Rev], 
[f].[Sequential_Number], [f].[Sheet_Number], [f].[Supplier_Code], [f].[TDate], [f].[Transmittal_Date], [f].[Transmittal_No], 
[f].[Transmittal_Type], [f].[TRN_Originator], [f].[TurnAroundDate], [f].[Unit_Code], 
[f].[TransmitUID] 
FROM [tblCorrespondenceLog] AS [f] 
WHERE CHARINDEX(N'f', [f].[Transmittal_No]) > 0

当从 SMSS (SQL Server Management Studio 2018) 启动时,它工作得很好吗?

如果我使用 crc 作为 document 的输入,我得到数据 return 正常编辑,但查询只是略有不同:

SELECT [f].[uID], [f].[Action_Required], [f].[Approved_Responded], [f].[Area_Code], [f].[Company_Document_No], 
[f].[Discipline], [f].[Document_Description], [f].[Document_Type], [f].[fileUID], [f].[Link], [f].[Originator_Code], 
[f].[Reference_Document], [f].[ResponsibelEngineer], [f].[ResubDate], [f].[ResubTransmittal], [f].[Rev], 
[f].[Sequential_Number], [f].[Sheet_Number], [f].[Supplier_Code], [f].[TDate], [f].[Transmittal_Date], [f].[Transmittal_No], 
[f].[Transmittal_Type], [f].[TRN_Originator], [f].[TurnAroundDate], [f].[Unit_Code], 
[f].[TransmitUID] 
FROM [tblCorrespondenceLog] AS [f]
WHERE (CHARINDEX(N'f', [f].[Transmittal_No]) > 0) AND (CHARINDEX(N'crc', LOWER([f].[Company_Document_No])) > 0)

所以... 为什么 entity framework 仅针对特定字符串和特定组合给我一个 'Data is Null' 错误。即使在 'problem' 字段上进行过滤(当然使用不同的字符串),函数也会 return 正确的值在哪里?

这是由 .NET Core 实体 Class 和数据库 table 之间的断开连接引起的;

class 配置设置为:

     builder.Property(e => e.DocumentDescription)
            .IsRequired()
            .HasColumnName("Document_Description")
            .HasMaxLength(150);

但是数据库 table 的这个字段是 allow null 因此有时会返回 null 其中 entity framework 没想到会看到 null.

删除 .IsRequired() 位即可。

     builder.Property(e => e.DocumentDescription)
            //.IsRequired()
            .HasColumnName("Document_Description")
            .HasMaxLength(150);

有趣的是,这并没有在开发环境中产生错误,但在部署时确实会导致问题。我一直无法弄清楚为什么会有所不同,但至少现在可以用了!