.NET6 WebAPI调用时出现EntityTypes非空校验异常求助
异常排查:EntityTypes must be not null and contains minimum 1 item
问题背景
基于.NET 6的WebAPI项目,控制器代码如下:
[ApiController] [Route("[controller]")] public class MenuController : ControllerBase { readonly UnitOfWork uow; public class MenuRequestDTO { public Guid? StoreOid { get; set; } } public MenuController(UnitOfWork _uow) { uow = _uow; } [HttpPost(Name = "full-download")] public async Task<WebMenu> MenuFullDownload(MenuRequestDTO data) { return await MenuDataHandler.GetFullMenu(uow, data.StoreOid!.Value); } }
调用接口http://localhost:5253/Menu时抛出异常:
System.InvalidOperationException: EntityTypes must be not null and contains minimum 1 item at Microsoft.Extensions.DependencyInjection.DataLayerFactory.<>c.<PrepareDataLayerFactoryFunc>b__3_3(Context ctx) at lambda_method2(Closure, Context) at Microsoft.Extensions.DependencyInjection.DataLayerFactory.<>c__DisplayClass3_0.<PrepareDataLayerFactoryFunc>b__21() at Microsoft.Extensions.DependencyInjection.XpoServiceCollectionExtensions.<>c__DisplayClass14_0`1.<AddXpoCustomSession>b__2(Guid key) at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) at Microsoft.Extensions.DependencyInjection.XpoServiceCollectionExtensions.<>c__DisplayClass14_1`1.<AddXpoCustomSession>b__1(IServiceProvider sp) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass2_0.<RealizeService>b__0(ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) at lambda_method11(Closure, IServiceProvider, Object[]) at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- End of stack trace from previous location --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
异常原因分析
该异常由DevExpress XPO框架抛出,核心问题是初始化数据层时,没有注册任何实体类型,导致框架无法识别数据模型,进而无法创建有效的数据操作上下文。
解决方向
- 检查XPO服务注册代码
在Program.cs中确认XPO的注册逻辑,必须显式添加需要操作的实体类型,示例如下:services.AddXpoDefaultUnitOfWork(true, options => options.UseConnectionString(Configuration.GetConnectionString("YourConnectionString")) .UseAutoCreationOption(AutoCreateOption.DatabaseAndSchema) .AddEntityTypes(typeof(WebMenu), typeof(YourOtherEntity))); // 至少添加一个实体类型 - 验证UnitOfWork依赖注入
如果自定义了UnitOfWork实现,确保它依赖的XPO Session是基于正确注册了实体的数据层创建的,避免手动创建Session时遗漏实体类型配置。 - 排查数据层初始化参数
检查是否在创建数据层的代码中,传入的EntityTypes参数为null或空集合,这是触发该异常的直接原因。
内容的提问来源于stack exchange,提问作者baer999
相关产品推荐
相关产品推荐

