Entity Framework .NET Core返回'数据为空。无法在Null值上调用此方法或属性。但不在调试器中

问题描述 投票:0回答:1

问题:

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

一个简单的HTML表,在特定列上具有8个过滤字段,通过API HttpGet调用在后端运行查询。该函数本身可以正常运行,但对于特定的字符串为NOT。例如,在字段“描述”上,后端返回“数据为空”。使用下面的字符串时,不能在Null值上调用此方法或属性。值在前端和后端之间正确传递,并且API调用通常返回适当的数据。

但是,诸如app之类的字符串比appapplication之类的字符串和诸如cert更长的字符串将返回“数据为空”错误。

如果我使用certificate作为f的输入,则会收到“数据为空”错误。但是,如果我在transmittal上使用crc,并且THEN使用document作为f的输入,该函数将返回普通数据?

这仅在部署状态下发生,调试代码时不会发生此问题。调试时,代码返回预期结果,并始终产生正确的响应。

使用一组“链接” where语句构建IQueryable的服务调用,该IQueryable被调用以在序列末尾返回transmittal


正在使用:

  • IIS,版本10,在虚拟机上运行
  • 操作系统IIS虚拟机:Windows Server 2016
  • 。Net核心:2.1
  • EntityFrameworkCore:2.1.11
  • SQL Server 2012(在同一VM上运行)
  • VS 2019
  • SQL Server Management Studio 2018

控制器代码

.ToListAsync()

ArchiveService代码

[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));
        }

给出错误的字段是具有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(); } 子句的字段

[当我使用SQL编写器获取被触发到服务器的查询时,我得到以下查询,当调用.Contains()时,将导致“数据为空”错误:

.ToListAsync()

哪个,当从SMSS(SQL Server Management Studio 2018)触发时,可以很好地工作吗?

如果我将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 用作crc的输入,我将返回正常返回的数据,但查询仅稍有不同:

document

所以...为什么实体框架仅在特定字符串和特定组合上给我一个“数据为空”错误。即使在“问题”字段上进行过滤,该函数将以其他方式返回适当的值(当然使用不同的字符串)?

sql entity-framework asp.net-core-mvc iis-10
1个回答
0
投票

这是由.NET Core实体类与数据库表之间的断开连接引起的;

类配置设置为:

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)

但是数据库表的此字段为 builder.Property(e => e.DocumentDescription) .IsRequired() .HasColumnName("Document_Description") .HasMaxLength(150); ,因此有时在实体框架不希望看到allow null的情况下返回null

删除null位完成了该工作。

.IsRequired()

虽然很有趣,但这在开发环境中不会产生错误,但是DID在部署时会引起问题。我还无法弄清为什么会有区别,但至少现在可以了!

© www.soinside.com 2019 - 2024. All rights reserved.