You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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框架抛出,核心问题是初始化数据层时,没有注册任何实体类型,导致框架无法识别数据模型,进而无法创建有效的数据操作上下文。

解决方向

  1. 检查XPO服务注册代码
    在Program.cs中确认XPO的注册逻辑,必须显式添加需要操作的实体类型,示例如下:
    services.AddXpoDefaultUnitOfWork(true, options =>
        options.UseConnectionString(Configuration.GetConnectionString("YourConnectionString"))
               .UseAutoCreationOption(AutoCreateOption.DatabaseAndSchema)
               .AddEntityTypes(typeof(WebMenu), typeof(YourOtherEntity))); // 至少添加一个实体类型
    
  2. 验证UnitOfWork依赖注入
    如果自定义了UnitOfWork实现,确保它依赖的XPO Session是基于正确注册了实体的数据层创建的,避免手动创建Session时遗漏实体类型配置。
  3. 排查数据层初始化参数
    检查是否在创建数据层的代码中,传入的EntityTypes参数为null或空集合,这是触发该异常的直接原因。

内容的提问来源于stack exchange,提问作者baer999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:51:19