无法创建 '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
我今天 运行 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>();
该工具尝试使用各种方法创建设计时数据库上下文实例。其中一种方法是寻找 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
。我需要在 运行 任何与构建相关的内容之前导出该变量。
就我而言,我构建了我的项目并且它运行良好。因此,请先尝试执行此简单步骤。
在.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
我今天 运行 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>();
该工具尝试使用各种方法创建设计时数据库上下文实例。其中一种方法是寻找 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
。我需要在 运行 任何与构建相关的内容之前导出该变量。
就我而言,我构建了我的项目并且它运行良好。因此,请先尝试执行此简单步骤。