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

使用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. 清理项目缓存并重建

  1. 删除项目根目录下的bin和obj文件夹
  2. 清理NuGet本地缓存:
dotnet nuget locals all --clear
  1. 重新生成解决方案:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:15:15