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

53

我在.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类:

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; }
}

2
请勿发布图片,而是发布代码(请参阅编辑帮助)。另外,请查看C#编码指南,使用非标准命名约定会使任何C#开发人员更难读懂代码 ;) - Tseng
@Tseng 我可以做到 :) - eman
除了我的回答下面的评论之外,你的问题有些误导性。你使用的是哪个版本?问题标记为asp.net core 2.0和2.1,但你的错误信息提到了3.1?所以:a)你正在使用哪个版本的ASP.NET Core?b)你安装了哪个版本的SDK? - Tseng
我将我的问题标签更改为 .NET Core 3.0 和 3.1 版本。 - eman
37个回答

88

我发现导致这个错误的原因可能是你代码中的多个问题。对我来说,最好的方法是在命令中添加 verbose。

通过这样做,你将能够理解问题出在哪里。verbose 将显示执行的所有步骤。

在 Visual Studio 中使用:

add-migration Added_something -verbose

使用命令行界面 (CLI):

dotnet ef migrations add Added_something  --verbose

3
这个答案显然应该被标记为正确答案。 - AFetter
6
是的,感谢 verbose,我能够发现我在 DbContext 实现中忘记添加一个无参数构造函数以及其他问题。 - Nicke Manarin
4
是的,这个答案更好。我的解决方案与其他人完全不同,但-verbose很容易找到它。 “授人以鱼不如授人以渔,教会一个人捕鱼,你就可以让他终身受用。” - John Pankowicz

35

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


这对我也是一样的情况。我认为它无法从appsettings.json中加载设置,因为这是由startup.cs处理的。 - jao
2
你救了我的一命(或者素食主义者的等价物)。非常感谢! - James Fleming
2
谢谢。如果AppDbContext、迁移和模型类是在与appsettings.jsonStartup.cs所在的项目不同的类库中定义的,那么在执行Update-Database之前,您需要将该项目标记为启动项目(右键单击该项目)。 - dpant
谢谢@Pelle,解决方案非常准确。 - Nayanajith
哇!谁会想到这个呢 :) - Gabriel Marius Popescu
哇!谁会想到这个呢 :) - undefined

26

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

这个包是为了让Entity Framework Core工具正常工作。确保你的启动项目是正确的,然后安装这个包。

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

帮助链接

添加迁移命令行界面:

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

更新数据库命令行界面:

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

移除 迁移命令行接口:

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

Entity Framework Core 工具参考 - .NET Core CLI


18

今天我运行 dotnet ef migrations add <MigrationName> 时也遇到了同样的问题。

我的项目有三个部分,主应用程序(Web)、带有 DBContext 的 C# 项目和用于模型的 C# 项目。

我通过 CLI 解决了这个问题。

dotnet ef migrations add AddCategoryTableToDb -s MainApp -p ProjectHavingDbContext

考虑启动(主)项目的路径。 - peyman
1
唯一有效的解决方案!我从解决方案根目录运行了这个命令。 - qwerfd
这是我在VS 2022中的解决方案根目录下使用开发人员PowerShell运行命令时有效的方法。NuGet包管理器控制台也正常工作。 - anon37894203
将启动项目添加到 CLI 对我有用!谢谢! - George Feakes

14

当我有两个DbContext构造函数时,我遇到了相同的错误。将无参数构造函数作为类中的第一个构造函数进行重新排列可以解决该问题。例如:

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

这里涉及到使用反射动态调用 DbContext 对象。


谢谢!这个对我在从2.2升级到.netcore 3.1时有所帮助。 - JokingBatman
1
显然,你需要有两个构造函数。我缺少了第一个。 - Max
是的,这很有帮助 - 你需要有一个无参构造函数 :) - Duck Ling
是的!第一个构造函数必须是无参构造函数。非常感谢您。虽然这是一个尴尬的错误。 - Daniel Ribeiro

6

如果您从 .NET Core 应用程序的 Program.cs 中删除了 static IHostBuilder CreateHostBuilder(string[] args) 方法,也会导致此错误。 (这是我的情况)


1
一样的问题。我在这个方法中添加了额外的参数,所以它出问题了。 - JuztBe

5

尝试这个 - 截至2021年3月 - VS 16.9.2

我尝试了以上的很多答案,但都没有解决我的问题。我的问题在于我们有多个启动项,所以第一步是只设置一个启动项,我将我们的 Data 项目设置为启动项。然后我仍然收到错误提示。然后我意识到(感谢@AFetter 的回答Data 项目内并没有连接字符串。于是,我将我的启动项设置为具有与数据库连接的 appSettings.json 文件,并确保包管理器控制台的默认项目设置为 Data 项目,重新运行创建迁移命令,这次成功了!


1
这个成功了。干得好! - Svinjica
太棒了!干得好! - undefined

3
如果您在使用 .Net 6 的新 最小托管模型 时遇到此问题,请检查在调用 AddDbContext 之前是否已经调用了 builder.build() 方法,并确保该方法是在 builder.services 上调用的。
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();

太好了!这么简单的问题居然被错过了!我找了很久,但我猜在从startup.cs转换到新的最小托管(program.cs)时,像我这样的人会错过这些小细节!谢谢!我已经按照新的dotnet 6方式解决了这个问题! - Dav.id

3

看起来您的继承出了问题。

public ApplicationDbContext : IdentityDbContext

应该是

public ApplicationDbContext : IdentityDbContext<ApplicationUser>

或者
public ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole>

如果您也扩展了角色类。

当您想要创建一个使用扩展用户类(而不是IdentityUser)的上下文时。


1
我使用公共的 ApplicationDbContext : IdentityDbContext<ApplicationUser>,但是仍然出现相同的错误 :( - eman
展示你的 Program.cs 文件,不确定你是否使用了一些过时的模式(例如来自 2.1 的 dotnet 工具方法名称,但是却有一个 3.0 或 3.1 应用程序)。 - Tseng
请勿在评论中发布代码/扩展信息,请更新您的问题... - Tseng
CreateHostBuilder 适用于 ASP.NET Core 2.1 及更高版本。如果您仍在针对 ASP.NET Core 2.0,它将不被识别,并应该调用 BuildWebhost。请参阅迁移文档。该方法的命名和返回类型对于 dotnet 工具链非常重要(例如 ef core 命令行和迁移),因为它会查找此方法以了解如何实例化 DbContext 进行迁移。 - Tseng

2

我在.Net 6中遇到了同样的问题 请确保AddDBContext在builder.Build之前

builder.Services.AddDbContext<DatabaseDBContext>(options => 
  options.UseSqlServer(builder.Configuration.GetConnectionString("sqlConnection"))
);
var app = builder.Build();

Program.cs文件中,请勿在下方编写任何带有builder.Services的内容。
var app = builder.Build()

如果没有加上换行符,代码会报错。


节省了我的时间。谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接