无法创建 'ApplicationDbContext' 类型的对象。对于设计时支持的不同模式

Unable to create an object of type 'ApplicationDbContext'. For the different patterns supported at design time

在.net core中添加数据库迁移时出现如下错误

这是错误:

这是Startup中的代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options => 
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
           
    services.AddDefaultIdentity<ApplicationUser>().AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllers();
}

这是ApplicationDbContext class:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    { }

    public DbSet<ApplicationUser> applicationUsers { get; set; }
}

这是ApplicationUser:

public class ApplicationUser : IdentityUser
{
    [Required]
    [Column(TypeName = "nvarchar(150)")]
    public string UserFName { get; set; }
    [Required]
    public string UserLName { get; set; }
}

看来你是你的继承是错误的。

public ApplicationDbContext : IdentityDbContext

应该是

public ApplicationDbContext : IdentityDbContext<ApplicationUser>

public ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole>

如果您还扩展角色 class。

当您想创建具有扩展用户的上下文时 class(而不是 IdentityUser

虽然 OP 面临的问题似乎是由于 AspNet Identity 提供的基础 classes 的不正确使用,但通常我们会在设计时无法创建 ApplicationDbContext 实例时遇到此错误。有几个解决方案。其中之一是在 StartUp class:

中的 ConfigureServices 方法中指定 ApplicationDbContext 提供程序
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options => {
        options.UseSqlServer(Configuration.GetConnectionString("MyConnection"));
    });
}

对于其他解决方案,请查看此link:https://docs.microsoft.com/en-gb/ef/core/miscellaneous/configuring-dbcontext#onconfiguring

我发现导致此错误的原因可能是您的代码中存在多个问题。至少对我来说,最好的方法是在命令中添加详细信息。

有了那个就能明白是什么问题了。 verbose 将显示执行的所有步骤。

在visual studio中使用:

add-migration Added_something -verbose

对于 CLI 使用:

dotnet ef migrations add Added_something  --verbose

我遇到了同样的错误....只是代码在几分钟前工作正常。 我正在用 Fluent API

替换一些 属性 属性

我有三个项目:WebApp、DataAccess 库和模型库。

在尝试了几次扰乱迁移的不成功尝试后...我最终做了 Build->Clean Solution 并在 WebApp 上进行了构建。 一切都恢复正常了...我无法重现错误。

如果选择了多个启动项目,也会出现此错误。我将我的 webproject 设置为启动项目,这为我解决了问题。

当我忘记在 Startup.cs 中执行此操作时,我遇到了这个错误。

services.AddTransient<IExcelMasterRepository, ExcelMasterRepository>();

如果您从 .net 核心应用程序的 Program.cs 中删除 static IHostBuilder CreateHostBuilder(string[] args) 方法,也会发生此错误。 (这是我的情况)

这个错误发生在我身上,但同时我也出现了An error occurred while accessing the Microsoft.Extensions.Hosting services. Continuing without the application service provider. Error: Could not parse the JSON file.

修复我的 appsettings.json 文件解决了问题。

我也有同样的错误,只是修改程序class。网络核心 3.0

    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

   public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }
    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>() 
            .Build();

我在 运行 来自 azure 管道任务的 dot net ef 迁移脚本命令时遇到了同样的问题。我确实添加了“-project”参数。但还是失败了。 添加“-startup-project”参数对我有用。 我猜即使我们在项目中指定了启动 class,但要让 ef 工具找到一个我们必须明确提及它们。

我的问题已通过安装 Microsoft.EntityFrameworkCore.Design nuget 包解决。

Entity Framework Core Tools 需要此包才能工作。确保你的启动项目是correct.then安装包。

在你的项目中 Build -> Clean Solution 然后再次尝试 运行 你的命令。

Help Link

添加迁移命令cli:

dotnet ef migrations add InitDatabase --project YourDataAccessLibraryName -s YourWebProjectName -c YourDbContextClassName --verbose 

更新数据库命令cli:

dotnet ef database update InitDatabase --project YourDataAccessLibraryName -s YourWebProjectName -c YourDbContextClassName --verbose

删除迁移命令cli:

dotnet ef migrations remove --project YourDataAccessLibraryName -s YourWebProjectName -c YourDbContextClassName --verbose

Entity Framework Core tools reference - .NET Core CLI

我今天 运行 dotnet ef migrations add <MigrationName>

时也遇到了同样的问题

我有三个项目,MainApp (Web)、带 DBContext 的 C# 项目和用于模型的 C# 项目。

我能够通过 CLI 解决它。

dotnet ef migrations add AddCategoryTableToDb -s MainApp -p ProjectHavingDbContext

当我有两个 DbContext 构造函数时,我遇到了同样的错误。重新排列构造函数后,无参数构造函数在 class 中首先被修复。例如

public ProgramDbContext() : base()
{
}
public ProgramDbContext(DbContextOptions<ProgramDbContext> options) : base(options)
{
}

一定是动态 DbContext 对象调用,反射播放。

我发现我不见了:

Microsoft.EntityFrameworkCore.Tool
Microsoft.EntityFrameworkCore.Design

我有多个启动项目(不同 API)。 我在 PM 控制台中处于不同的级别。 然后我了解到我必须关闭 SQL 管理,这样我才能 运行 PM 控制台命令。

就我而言,这是因为我将我的数据类型和迁移存储在一个单独的“数据”项目中,并且不小心将其设置为启动项目而不是我的实际启动项目。

从 2021 年 3 月开始尝试这个 - VS 16.9.2

我尝试了上面的许多答案,none 对我有用。我的问题是我们有多个启动项目,所以这是第一步。只需设置一个启动项目,所以我将 Data 项目设置为启动项目。仍然有错误。然后它击中了我(感谢@AFetter 的 Data 项目中没有连接字符串。所以我将我的启动项目设置为一个带有 appSettings.json 文件的项目,该文件与数据库有连接,然后确保将包管理器控制台的默认项目设置为 Data 项目并重新运行命令以创建迁移并且成功了!

在我的例子中,我在 appsettings.json 中遗漏了一个 属性,它显示为警告而不是错误

此错误消息有时与数据库上下文模型没有直接关系。检查 Startup class 中的其他错误,例如 appsettings.json/appsettings.Development.json

中缺少属性/凭据

运行 使用 --verbose 选项进行迁移以查看所有错误和警告

dotnet ef migrations add YourMigrationName  --verbose

出现同样的错误...

Here's how I got there:
Created a new ASP.NET Core Web App (Model-View-Controller)
Target Framework was .NET Core 3.1 (LTS)
Authentication Type: Individual Accounts

项目创建后...我希望能够修改 register/login 流程。(但这些页面是 Razor Class 库的一部分)
所以要获取项目中的页面:我右键单击项目 Add->New Scaffolded Item...
并选择了 Identity...
接下来我需要 Add-Migration InitIdentity...这是 errors/trouble 开始的地方。

我尝试阅读并完成其他一些答案,但没有成功。
我通过以下方式找到了解决方案:
像(上图)
一样创建项目 但这次我决定不使用脚手架身份。(还)
我在 application.config 和 运行 项目中放置了一个连接字符串。
我在添加迁移之前做了这个。
我进去注册了...出现一个屏幕,说迁移还没有 运行 并且有一个按钮可以 运行 迁移。我按下它并进行了刷新,一切都很好。
此时我回到项目并做了一个 Add->Scafolded Item...,现在没有错误,我可以修改 Auth 屏幕。

彻底检查您的 appsettings 文件并确保其格式正确。注意丢失的字符或不必要的字符

就我而言,我使用的是自定义 IdentityErrorDescriber :

  services.AddIdentity<AppIdentityUser, AppIdentityRole>()
              .AddErrorDescriber<MyIdentityErrorDescriber>() // comment this !
              .AddEntityFrameworkStores<MyDbContext>()
              .AddDefaultTokenProviders();

在我的 MyIdentityErrorDescriber 中,我使用资源来翻译错误。 当我注释掉 .AddErrorDescriber<MyIdentityErrorDescriber>() 行时,迁移工作没有任何错误。我认为问题出在 IdentityErrorDescriber 或 Resources.

我有三个项目,一个是 Api,第二个是模型,第三个是 ApplicationDbContext。 Api 项目正在启动项目。我已经将 Microsoft.EntityFrameworkCore.Design nuget 包添加到 Api 项目(这是起始项目)并解决了问题。

我遇到了同样的错误,当我添加它时它工作正常:

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnStr")));
            services.AddScoped<IuserRepositorhy, UserRepository>();

阅读这篇文章:https://docs.microsoft.com/en-gb/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli#from-a-design-time-factory

该工具尝试使用各种方法创建设计时数据库上下文实例。其中一种方法是寻找 IDesignTimeDbContextFactory.

的实现

Some of the EF Core Tools commands (for example, the Migrations commands) require a derived DbContext instance to be created at design time in order to gather details about the application's entity types and how they map to a database schema. In most cases, it is desirable that the DbContext thereby created is configured in a similar way to how it would be configured at run time.

您的数据库上下文工厂 class 可能如下所示:

public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> {
    public BlazorContext CreateDbContext(string[] args) {
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        optionsBuilder.UseSqlite("Filename=db.sqlite3");

        return new ApplicationDbContext(optionsBuilder.Options);
    }
}

如果您使用的是Docker-Compose 项目。您需要卸载 Docker-Compose 项目,然后清理并重建解决方案并设置启动项目。

我在 EFCore 中创建了迁移。

如果您在使用 .Net 6 和新 minimal hosting model 时遇到此问题,请在 [=13] 上调用 AddDbContext 之前检查您是否没有调用 builder.build() =].

using MyProject.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);


// Add services to the container.
builder.Services.AddRazorPages();
string relativePath = ".";
string databasePath = Path.Combine(relativePath, "MyDb.sqlite");


builder.Services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlite($"Data Source={databasePath}") //connection string
        );

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}



app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

我在应用程序设置文件中有两个连接字符串配置,都缺少逗号分隔。当我输入逗号时,错误消失了。

这可能不是您的问题,但这是导致我这边出现错误的原因。如果您的应用程序在构建时加载环境变量,则应在终端中声明该变量。就我而言,我的应用程序从 json 文件加载了我的 GOOGLE_APPLICATION_CREDENTIALS。我需要在 运行 任何与构建相关的内容之前导出该变量。

就我而言,我构建了我的项目并且它运行良好。因此,请先尝试执行此简单步骤。