Unable to create an object of type '[DBContext's Name]'. For the different patterns supported at design time [closed]

孤人 提交于 2021-01-21 00:34:09

问题


I'm following one of Mosh Hamedani Course on ASP.NET MVC in Udemy.

I came across one error while designing my Database using code-first (Entity Framework).

At first, I got the error of " No DbContext was found in assembly". After resolving this problem another one surged from nowhere.

The image below will show you the error found while adding a migration. I've already searched for the same error but in vain. I'm struggling for the past two hours but nothing is solved till now.

Please, someone, help me. Thanks

unable to create an object of type 'Vidly_Context'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728


回答1:


1- Make sure to set your web project as Set as Startup Project

2- In Package Manager Console, set your data access layer (if any) as a default project

3- Then run the command again




回答2:


I ran into this issue when using EF Core code-first migrations in a .NET Core 3 solution that contained both an MVC project and a Blazor project.

If I have the solution's startup project set to the Blazor project I get the error when using add-migration, but I don't if I have the startup project set to the MVC project.

From reading the documentation page linked to by the error message and comparing the code in the startup.cs files for both projects I'm not sure why that would be, but temporarily switching the startup project to the MVC project fixes it for me.




回答3:


The error message states that the context could not be created at design time. If you specify in the migration command the startup project with the --startup-project flag (or -s) you can help the command create the context instance at design time in a similar way to how it would be created at run time.

For example:

cd ./project_with_migrations_folder
dotnet ef --startup-project ../my_startup_project_path/ migrations add myMigration01



回答4:


I ran into the same issue. OP mentioned they needed to add code to their Startup.cs.

On https://go.microsoft.com/fwlink/?linkid=851728 there's the following code sample;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();
}

My code was missing the following in my ConfigureServices method;

services.AddDbContext<ApplicationDbContext>();

After adding this for my database context the issue was resolved.




回答5:


I got this error because a comma was missing in my appsettings.json

{
  "ConnectionStrings": {
    "DefaultCoonection": "Data Source=Leonardo-Notebook;Initial Catalog=MyDB;Integrated Security=True"
  } <- Comma missing here
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}



回答6:


I got this error after placing my DbContext in a separate class library using .NET Core 3.1.

Final solution looked like this that picked up my connection string from my original applications appsettings.json:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace MyNamespace
{
    public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json")
                    .Build();

            var optionsBuilder = new DbContextOptionsBuilder();

            var connectionString = configuration
                        .GetConnectionString("DefaultConnection");

            optionsBuilder.UseSqlServer(connectionString);

            return new ApplicationDbContext(optionsBuilder.Options);
        }
    }
}

I could then use this in my other project like this:

var applicationDbContextFactory = new ApplicationDbContextFactory();

using (var dbContext = applicationDbContextFactory.CreateDbContext(args))
{
    
}



回答7:


In StartUp file ConfigureServices method

services.AddDbContextPool<contextName>(
                    options => options.UseSqlServer(Configuration.GetConnectionString("conString")));



回答8:


If you are using a properly authenticated database server like Azure SQL DB, check whether you replace the Password={your_password} with your server password in your connection string.




回答9:


this is one of the most nonsense issues you'd ever encounter with ASP.NET Core. I am not really sure about the course you mentioned but if your application is just like mine where presentation layer is segregated from data layer; make sure that you install the latest version of Microsoft.EntityFrameworkCore.Design on your presentation layer too "your startup project". It is required, and the error message says nothing about it.




回答10:


It's not really an issue with the framework, it's how you built your application. For example, if you used DI and you had the WebApi (or the MVC project) separeted from your data access layer, this will occur to you because when you try to add a migration, you context cant find the connection string that you're trying to inject (this actually was my case).

A good explanation is found here on GitHub:

That's definitely not an app issue which is this scope of the issues in this repo, but I'll try to give you some guidance anyway.

You get that error because to generate migrations you need either:

  1. A DbContext with a default constructor (that is, a parameterless constructor)

  2. Being able to get the DbContext from ApplicationServices (that is, Dependency Injection)

  3. A design time factory that returns a properly configured DbContext.

Since ApplicationDbContext constructor has a parameter, you have to use options 2 or 3. See the details in the article: https://docs.microsoft.com/ef/core/miscellaneous/cli/dbcontext-creation

But option 2 (the one originally used) doesn't work any more, because the program startup was changed to improve logging.

And, since there's no DesignTimeFactory for ApplicationDbContext you just won't be able to create migrations at this time.

If you want to learn about this way for creating migrations you can:

Create an ApplicationDbContextDesignTimeFactory, similar to CatalogContextDesignFactory > or IntegrationEventLogContextDesignTimeFactory, or Try with other microservice like Catalog.API, that already has its DesignTimeFactory.




回答11:


If your startup project uses the ASP.NET Core Web Host or .NET Core Generic Host, the tools try to obtain the DbContext object from the application's service provider, otherwise you could create the DbContext from a design-time factory (https://docs.microsoft.com/es-es/ef/core/miscellaneous/cli/dbcontext-creation).




回答12:


In my case, I made the appsettings.development.json file mandatory but I didn't create the file. If you are not creating the enviroment specific setting file, set it as optional: true

var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();

But, it is important to note that the error may not necessarily related to the DbContext and its configurations. It could be some other error in your application startup which prevents the app from booting up so that the EF tooling can do the migration. As a mechanism to locate any other error in your project startup, you can add console message at various lines of your Startup. You can even inspect appsetting values like connectionstrings using console while trying to migrate.

 Console.WriteLine("I can see this because the app was able to proceed this far."); 


来源:https://stackoverflow.com/questions/55123853/unable-to-create-an-object-of-type-dbcontexts-name-for-the-different-patte

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!