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

时间:2020-01-18 00:17:47

标签: c# asp.net-core .net-core .net-core-3.0 .net-core-3.1

在.net核心中添加数据库迁移时,我遇到以下错误

这是错误:

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

19 个答案:

答案 0 :(得分:18)

我发现导致此错误的原因可能是您的代码中有很多东西。至少对我而言,最好的方法是在命令中添加详细信息。

这样您就可以了解问题所在了。 verbose将显示执行的所有步骤。

在Visual Studio中使用:

add-migration Added_something -verbose

对于CLI使用:

dotnet ef migrations add Added_something  --verbose

答案 1 :(得分:7)

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

答案 2 :(得分:2)

我的问题通过安装SELECT department_name, max(city) city, COUNT(employees.department_id) no_of_employees FROM departments JOIN employees on (departments.department_id=employees.department_id) JOIN locations USING (location_id) GROUP BY department_name; nuget软件包解决了。

实体框架核心工具需要此软件包。确保您的启动项目正确无误,然后安装该软件包。

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

Help Link

添加迁移命令cli:

Microsoft.EntityFrameworkCore.Design

更新数据库命令cli:

dotnet ef migrations add InitDatabase --project YourDataProjectName -s YourWebProjectName -c YourDbContextName --verbose 

Entity Framework Core tools reference - .NET Core CLI

答案 3 :(得分:2)

我发现我不见了:

Microsoft.EntityFrameworkCore.Tool
Microsoft.EntityFrameworkCore.Design

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

似乎您是您的继承人,这是错误的。

public ApplicationDbContext : IdentityDbContext

应该是

public ApplicationDbContext : IdentityDbContext<ApplicationUser>

public ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole>

如果您还扩展角色类。

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

答案 7 :(得分:0)

在从azure管道任务运行dot net ef migrations脚本命令时,我遇到了同样的问题。我确实添加了“ -project”参数。但是仍然失败。 添加“ -startup-project”参数对我有用。 我想,即使我们在project中指定了启动类,对于ef工具来说,我们也必须明确提及它们。

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

得到同样的错误...

<块引用>

我是这样实现的:
创建了一个新的 ASP.NET Core Web 应用 (模型-视图-控制器)
目标框架是.NET Core 3.1 (LTS)
身份验证类型:个人帐户

一旦项目创建...我希望能够修改注册/登录过程。(但这些页面是 Razor 类库的一部分)
因此,要获取项目中的页面:我右键单击项目 Add->New Scaffolded Item...
并选择了Identity...
接下来我需要Add-Migration InitIdentity...这就是错误/麻烦开始的地方。

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

答案 11 :(得分:0)

就我而言,我在 appsettings.json 中缺少一个显示为警告而不是错误的属性

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

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

dotnet ef migrations add YourMigrationName  --verbose

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

时也遇到了同样的问题

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

我能够从CLI解析它。

dotnet ef migrations add AddCategoryTableToDb -s MainApp -p ProjectHavingDbContext

答案 14 :(得分:0)

我有同样的错误,只是修改程序类。 Net Core 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();

答案 15 :(得分:0)

这个错误发生在我身上,但同时我也遇到了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文件可以解决此问题。

答案 16 :(得分:0)

当我在Startup.cs中忘记执行此操作时遇到了此错误,希望它对某人有帮助:)

services.AddTransient<IExcelMasterRepository, ExcelMasterRepository>();

答案 17 :(得分:0)

我遇到了同样的错误...。只是代码在几分钟前运行良好。 我正在用Fluent API

替换一些属性属性

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

尝试了几次失败的尝试以解决迁移问题之后,我最终做了Build->Clean Solution并在WebApp上进行了构建。 一切都恢复正常了……我无法重现错误。

答案 18 :(得分:0)

尽管OP似乎面临该问题,这似乎是由于AspNet Identity提供的基类的使用不正确,但通常在设计时无法创建ApplicationDbContext实例的情况下,我们会遇到此错误。有两种解决方案。其中之一是在StartUp类的ConfigureServices方法中指定ApplicationDbContext提供程序:

TreeNode groupnode = EmojisTreeView.Nodes.Add("Group Name");

EmojiNode emojiNode = new EmojiNode(subgroupEmojiName, unicodeEndStr, emojiConvertResultStr);
int groupsubemojinode = groupsubnode.Nodes.Add(emojiNode);

foreach (var node in EmojisTreeView.Nodes.OfType<EmojiNode>())
{
   // count is 0
}

    public class EmojiNode : TreeNode
    {
        public string emojiName;
        public string emojiValue;
        public string emojiConvertedResultStr;

        public EmojiNode(string emojiName, string emojiValue, string emojiConvertedResultStr)
        {
            this.emojiName = emojiName;
            this.emojiValue = emojiValue;
            this.emojiConvertedResultStr = emojiConvertedResultStr;

            this.Text = this.emojiConvertedResultStr + " " + this.emojiName;
        }

        public EmojiNode(string emojiName)
        {
            this.emojiName = emojiName;

            this.Text = this.emojiName;
        }

        public string getEmojiName()
        {
            return this.emojiName;
        }

        public string getEmojiValue()
        {
            return this.emojiValue;
        }

        public string getEmojiConvertedResultStr()
        {
            return this.emojiConvertedResultStr;
        }
    }

有关其他解决方案,请查看以下链接:https://docs.microsoft.com/en-gb/ef/core/miscellaneous/configuring-dbcontext#onconfiguring