我在使用 EF Core 的 .Net Core 2.2 Web API 中遇到问题。我在 MySQL 数据库上调用存储过程(我使用的是 Pomelo 2.1.4)。
它抱怨无法从 DbNull 转换为 String:
错误:无法将“System.DBNull”类型的对象转换为“System.String”类型。 在 C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:第 210 行的 MySql.Data.MySqlClient.MySqlDataReader.GetString(Int32 ordinal) 在 Microsoft.EntityFrameworkCore 的 lambda_method(Closure, DbDataReader) 处。 Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader) 在 Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable
1.AsyncEnumerator.BufferlessMoveNext(DbContext _, Boolean buffer, CancellationToken cancellationToken) at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func
4 操作,Func4 verifySucceeded, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable
1.AsyncEnumerator.MoveNext(CancellationToken cancelToken) 在 System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator2.MoveNextCore(CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Select.cs:line 106
1.MoveNext(CancellationToken cancelToken) 在 D:\a\1\s\Ix.NET\Source\System.Interactive.Async\AsyncIterator.cs:Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor
at System.Linq.AsyncEnumerable.AsyncIterator1.EnumeratorExceptionInterceptor.MoveNext(CancellationToken cancellationToken) at System.Linq.AsyncEnumerable.Aggregate_[TSource,TAccumulate,TResult](IAsyncEnumerable
1 源的第 98 行, T积累种子,功能3 accumulator, Func
D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Aggregate.cs 中的 2 resultSelector, CancellationToken cancelToken):PropWorx.API.Controllers.FileActivitiesController.GetFileActivities(Int32 fileId, String fromDate 的第 120 行, String toDate) 在 C:\Users\fabsr\source\repos\PropWorx.API\PropWorx.API\Controllers\FileActivitiesController.cs:Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute 的第 101 行(IActionResultTypeMapper 映射器, ObjectMethodExecutor 执行器,对象控制器,Object[] 参数)在 System.Threading.Tasks.ValueTask`1.get_Result() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker。在 Microsoft.AspNetCore.Mvc.Internal 上调用 NextActionFilterAsync()。ControllerActionInvoker.Rethrow(ActionExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore .Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext 上下文) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted ) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc 的 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) Rethrow(ActionExecutedContext context) .Internal.ResourceInvoker.InvokeNextResourceFilter() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 上的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc 的 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) Rethrow(ActionExecutedContext context) .Internal.ResourceInvoker.InvokeNextResourceFilter() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 上的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()上下文)在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)。 ResourceInvoker.InvokeAsync()在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()上下文)在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)。 ResourceInvoker.InvokeAsync()InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc .Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc .Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
在 Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在 PropWorx.API.Middlewares.TenantIdentifier.Invoke(HttpContext httpContext, SharedContext sharedContext) 在 C:\Users \fabsr\source\repos\PropWorx.API\PropWorx.API\Middlewares\TenantIdentifier.cs:Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware 的第 73 行。在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware 调用(HttpContext 上下文)。在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context) 的 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) 的 Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
问题线是:
List<FileActivity> fileActivities = await _context.FileActivities.FromSql("CALL file_activity_procedure(@fromDate, @toDate, @fileId)", param1, param2, param3).ToListAsync();
FileActivity 模型是:
public class FileActivity
{
public int Id { get; set; }
public DateTime? Date { get; set; }
public int FileId { get; set; }
public string FileNumber { get; set; }
public string Area { get; set; }
public int? RecordId { get; set; }
public string Description { get; set; }
public string Type { get; set; }
public string TypeInfo { get; set; }
public decimal? Debit { get; set; }
public decimal? Credit { get; set; }
public string AddedBy { get; set; }
public DateTime? AddedDate { get; set; }
public string Comments { get; set; }
}
最后,DbContext 中的映射是:
modelBuilder.Entity<FileActivity>(entity =>
{
entity.Property(e => e.Id)
.HasColumnName("ID")
.HasColumnType("int(11)");
entity.Property(e => e.Date)
.HasColumnName("Date")
.HasColumnType("datetime");
entity.Property(e => e.FileId)
.HasColumnName("file_id")
.HasColumnType("int(11)");
entity.Property(e => e.FileNumber)
.IsRequired()
.HasColumnName("file_num")
.HasColumnType("varchar(50)");
entity.Property(e => e.Description)
.IsRequired()
.HasColumnName("description")
.HasColumnType("varchar(255)");
entity.Property(e => e.Type)
.HasColumnName("type")
.HasColumnType("varchar(255)");
entity.Property(e => e.TypeInfo)
.HasColumnName("type_info")
.HasColumnType("varchar(255)");
entity.Property(e => e.Debit)
.HasColumnName("Debit")
.HasColumnType("decimal(13,4)")
.HasDefaultValueSql("'0.0000'");
entity.Property(e => e.Credit)
.HasColumnName("Credit")
.HasColumnType("decimal(13,4)")
.HasDefaultValueSql("'0.0000'");
entity.Property(e => e.RecordId)
.HasColumnName("record_id")
.HasColumnType("int(11)");
entity.Property(e => e.AddedBy)
.HasColumnName("Added_By")
.HasColumnType("varchar(45)");
entity.Property(e => e.AddedDate)
.HasColumnName("added_date")
.HasColumnType("datetime");
entity.Property(e => e.Comments)
.HasColumnName("comment")
.HasColumnType("text");
});
我整天都在绞尽脑汁想弄清楚这个……有什么想法吗?