如何使用具有最小 API .Net 6 的 Asp.net core Identity 运行迁移(第一次迁移)

Posted

技术标签:

【中文标题】如何使用具有最小 API .Net 6 的 Asp.net core Identity 运行迁移(第一次迁移)【英文标题】:How can I run migration (first migration) with Asp.net core Identity with Minimal API .Net 6 【发布时间】:2021-11-22 08:55:24 【问题描述】:

我已经创建了一个 asp.net 6 最小的 API 项目,它的结构如下:

Program.cs

using WebApplication1.EndPointExtension;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointDefinitions(typeof(IEndpointDefinition));


var app = builder.Build();
app.UseEndpointDefinitions();
if (builder.Environment.IsDevelopment())

app.UseDeveloperExceptionPage();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

IEndpointDefinition.cs

public interface IEndpointDefinition

    void DefineServices(IServiceCollection services);
    void DefineEndpoints(WebApplication app);

EndpointDefinition.cs

public static class EndpointDefinitionExtensions

    public static void AddEndpointDefinitions(
        this IServiceCollection services, params Type[] scanMarkers)
    
        var endpointDefinitions = new List<IEndpointDefinition>();

        foreach (var marker in scanMarkers)
        
                endpointDefinitions.AddRange(
                marker.Assembly.ExportedTypes
                .Where(x => typeof(IEndpointDefinition).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
                .Select(Activator.CreateInstance).Cast<IEndpointDefinition>());
        

        foreach (var endpointDefinition in endpointDefinitions)
        
            endpointDefinition.DefineServices(services);
        

        services.AddSingleton(endpointDefinitions as IReadOnlyCollection<IEndpointDefinition>);
    

    public static void UseEndpointDefinitions(this WebApplication app)
    
        var definitions = app.Services.GetRequiredService<IReadOnlyCollection<IEndpointDefinition>>();

        foreach (var endpointDefinition in definitions)
        
            endpointDefinition.DefineEndpoints(app);
        
    

下面是我的 DB Context 类,它实现了端点接口并继承了核心标识类 DatabaseDBContext.cs

public class DatabaseDBContext : IdentityDbContext, IEndpointDefinition

    public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options) : base(options)
    

    

    public void DefineEndpoints(WebApplication app)
    
        app.UseAuthentication();
    

    public void DefineServices(IServiceCollection services)
    
        services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<DatabaseDBContext>();
    

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();

        var connectionString = configuration.GetConnectionString("AppDb");
        if (!optionsBuilder.IsConfigured)
            optionsBuilder.UseSqlServer(connectionString);
    

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        base.OnModelCreating(modelBuilder);
    

我已经安装了迁移所需的 NuGet 包,并在 appsetting.js 中提供了连接字符串,但是当我构建项目时,它显示错误为

System.MissingMethodException:'无法动态创建类型为'WebApplication1.DatabaseDBContext'的实例。原因:没有定义无参数构造函数

我想知道到底哪里出了问题,或者我没有使用正确的方法。

【问题讨论】:

您是否尝试注册您的DbContext?即调用AddDbContextAddDbContextPool ? @GuruStron 这个错误很有趣,但我只是明确地调用了默认构造函数并且它起作用了。例如。公共 DatabaseDBContext() 【参考方案1】:

经过这么多次尝试解决它,我只是显式调用了默认构造函数

public DatabaseDBContext()



它成功了。

【讨论】:

以上是关于如何使用具有最小 API .Net 6 的 Asp.net core Identity 运行迁移(第一次迁移)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 6 Minimal API

如何在 ASP.NET 中使用具有 HTML 正文 + 附件的 GMAIL API 发送电子邮件

如何使用 ASP.NET 5 MVC 6 保护 Web API

使用具有多个来源的 PUT 和 DELETE 请求时如何解决 ASP.NET Web API CORS Preflight 问题?

如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌

具有摘要式身份验证的 ASP.Net Web API