使用EF Core和SQL Server初始化IdentityServer4数据时遇异常求助
问题分析与解决方案
异常根源
从异常栈可定位核心问题:
- .NET 6及以上版本新增了
System.Linq.Enumerable.MaxFloat<T>扩展方法,该方法的泛型约束要求T必须实现IFloatingPoint<T>接口 - 你使用的IdentityServer4.EntityFramework依赖的AutoMapper版本过低,在扫描类型扩展方法时,错误尝试用
System.Char类型实例化MaxFloat<T>,违反泛型约束,导致所有依赖AutoMapper的资源映射(IdentityResource/ApiScope等)初始化失败
解决方案
1. 升级AutoMapper到兼容版本
直接升级AutoMapper到支持.NET 6+的稳定版本(推荐11.x及以上),该版本修复了扩展方法扫描的问题:
dotnet add package AutoMapper --version 11.0.1
2. 同步IdentityServer4.EntityFramework版本
确保IdentityServer4.EntityFramework版本与你的.NET版本匹配:
- 若使用.NET 6,升级到IdentityServer4.EntityFramework 4.x稳定版:
dotnet add package IdentityServer4.EntityFramework --version 4.1.2
3. 清理项目缓存并重建
- 删除项目根目录下的
bin和obj文件夹 - 清理NuGet本地缓存:
dotnet nuget locals all --clear
- 重新生成解决方案:
dotnet build
4. 验证初始化代码正确性
确保数据初始化代码遵循官方规范,示例如下:
using IdentityServer4.EntityFramework.DbContexts; using IdentityServer4.EntityFramework.Mappers; using Microsoft.EntityFrameworkCore; public static void InitializeDatabase(IApplicationBuilder app) { using var scope = app.ApplicationServices.CreateScope(); var services = scope.ServiceProvider; // 迁移持久化授权数据库 services.GetRequiredService<PersistedGrantDbContext>().Database.Migrate(); var configDb = services.GetRequiredService<ConfigurationDbContext>(); configDb.Database.Migrate(); // 初始化IdentityResources if (!configDb.IdentityResources.Any()) { foreach (var resource in Config.GetIdentityResources()) { configDb.IdentityResources.Add(resource.ToEntity()); } configDb.SaveChanges(); } // 同理初始化ApiScopes、ApiResources、Clients // ... }
确认Config类中的资源定义没有自定义的char类型属性,避免触发额外映射错误。
5. 临时降级方案(不推荐)
如果暂时无法升级依赖,可降级项目到.NET 5,避开.NET 6+新增的Linq扩展方法,但这只是临时规避,长期建议升级到兼容版本。
内容的提问来源于stack exchange,提问作者ByteNinja
相关产品推荐
相关产品推荐

