无法创建类型为'DbContext'的对象

65

当我尝试运行时

dotnet ef migration add Init

我遇到错误

无法创建类型为“IdentityContext”的对象。

我知道导致这个问题的原因。我想学习如何使用消息总线,并将其添加到我的项目中,所以我参加了一些课程并实现了它。当然,总线运行得很完美。但问题是我不再能够通过EF进行迁移。

我的Startup.cs之前是这样的。

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

现在它看起来是这样的。

public static void Main(string[] args)
{
  ServiceHost.Create<Startup>(args)
    .UseRabbitMq()
    .Build()
    .Run();
}

ServiceHost 类

public void Run() => _webHost.Run();

public static HostBuilder Create<TStartup>(string[] args) where TStartup : class
{
  Console.Title = typeof(TStartup).Namespace;
  var config = new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .AddCommandLine(args)
    .Build();
  var webHostBuilder = WebHost.CreateDefaultBuilder()
    .UseConfiguration(config)
    .UseStartup<TStartup>();

  return new HostBuilder(webHostBuilder.Build());
}

有人能指导一下迁移为什么停止工作吗?在我看来,它应该可以正常工作,但实际上它并没有,所以我想我肯定错了。

当然,在我的Startup.cs中也有相应配置。

services.AddEntityFrameworkNpgsql().AddDbContext<IdentityContext>(options =>
    options.UseNpgsql(Configuration.GetConnectionString("IdentityConnection")));

编辑 IdentityContext 类:

  public class IdentityContext : DbContext
  {
    public IdentityContext(DbContextOptions<IdentityContext> options) : base(options)
    {
      while (!Debugger.IsAttached)
      {
        Thread.Sleep(100);
      }
    }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      modelBuilder.Entity<User>().HasIndex(user => user.Email).IsUnique();
      modelBuilder.Entity<User>().HasIndex(user => user.Username).IsUnique();
    }
  }

编辑2. 详细迁移

Using project '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj'.
Using startup project '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj'.
Writing '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/obj/CrossX.Identity.csproj.EntityFrameworkCore.targets'...
dotnet msbuild /target:GetEFProjectMetadata /property:EFProjectMetadataFile=/tmp/tmpCq3PQa.tmp /verbosity:quiet /nologo /home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj
Writing '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/obj/CrossX.Identity.csproj.EntityFrameworkCore.targets'...
dotnet msbuild /target:GetEFProjectMetadata /property:EFProjectMetadataFile=/tmp/tmpR48yu8.tmp /verbosity:quiet /nologo /home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj
dotnet build /home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj /verbosity:quiet /nologo

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.17
dotnet exec --depsfile /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.deps.json --additionalprobingpath /home/msek/.nuget/packages --runtimeconfig /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.runtimeconfig.json /home/msek/.dotnet/tools/.store/dotnet-ef/2.2.2/dotnet-ef/2.2.2/tools/netcoreapp2.2/any/tools/netcoreapp2.0/any/ef.dll migrations add Init --assembly /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.dll --startup-assembly /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.dll --project-dir /home/msek/Projects/inz/CrossX/src/CrossX.Identity/ --language C# --working-dir /home/msek/Projects/inz/CrossX/src/CrossX.Identity --verbose --root-namespace CrossX.Identity
Using assembly 'CrossX.Identity'.
Using startup assembly 'CrossX.Identity'.
Using application base '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2'.
Using working directory '/home/msek/Projects/inz/CrossX/src/CrossX.Identity'.
Using root namespace 'CrossX.Identity'.
Using project directory '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/'.
Finding DbContext classes...
Finding IDesignTimeDbContextFactory implementations...
Finding application service provider...
Finding IWebHost accessor...
No CreateWebHostBuilder(string[]) method was found on type 'CrossX.Identity.Program'.
No application service provider was found.
Finding DbContext classes in the project...
Found DbContext 'IdentityContext'.
Microsoft.EntityFrameworkCore.Design.OperationException: Unable to create an object of type 'IdentityContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728 ---> System.MissingMethodException: No parameterless constructor defined for this object.
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean wrapExceptions, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean skipCheckThis, Boolean fillCache)
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass12_3.<FindContextTypes>b__13()
   --- End of inner exception stack trace ---
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass12_3.<FindContextTypes>b__13()
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Unable to create an object of type 'IdentityContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

1
我一直使用以下方式将数据库上下文注册到Postgres中:services.AddDbContext(options => options.UseNpgsql(Configuration.GetConnectionString("IdentityConnection")));你能试一下并检查它是否有效吗? - carlos chourio
相同的错误。无法创建类型为“IdentityContext”的对象。 - Thou
你调试并检查了启动类是否被正确调用了吗? - carlos chourio
如果您将此更改为: .UseConfiguration(config) .UseStartup();``` 而不是 ```var webHostBuilder = WebHost.CreateDefaultBuilder() .UseConfiguration(config) .UseStartup(); return new HostBuilder(webHostBuilder.Build());``` - carlos chourio
遇到了同样的问题。原因是我从解决方案文件夹中运行CLI命令,如果是这样,必须定义启动项目:dotnet ef migrations add mymigration --startup-project .\Project-With-Startup.cs --project .\Project-With-Context --context MyContext - kaah
显示剩余2条评论
20个回答

1

如果对于使用 .Net 6 的人有所帮助,我想补充一些最新信息。
在我的情况下,使用 .Net 6 和 dotnet-ef 版本为 '6.0.4',使其正常工作的关键是确保没有参数的构造函数存在并且是公共的,例如:

public TestContext()
{
}

我的问题是VS Code为我创建了一个受保护的构造函数。
一些试过但没有任何影响的方法包括:-
  • 您的控制台应用程序是否使用顶级语句,
  • 不需要有TestContext(options)构造函数。

1
在 Program.cs 中,我在 builder.Services.AddDbContext 之前调用了 builder.Build()。只需在最后调用 builder.Build() 就可以解决问题。

1
EF需要能够获取DbContext的实例。
这里的答案中:
确保将默认启动项目设置为WebApplication。 然后在包管理器控制台将默认项目设置为Data项目。这将使用WebApplication配置并将迁移添加到Data项目中。
如果您正在运行update-database命令,则需要将默认项目设置为包含Startup.cs文件的WebAPI项目。

1

0
在我的情况下,问题的原因是对dbsettings.json文件路径不正确。这个路径应该写在Startup.cs文件中。
 public Startup(Microsoft.AspNetCore.Hosting.IHostingEnvironment hostEnv)
    {
        _confString = new ConfigurationBuilder().SetBasePath(hostEnv.ContentRootPath).AddJsonFile("dbsettings.json").Build();
    
    }

0

我在程序包管理器控制台中编写了以下命令,问题得到解决:

dotnet-ef migrations add migrationName --context DBContext --project=MyProject.Data --startup-project=MyProject.Web -o Persistence\Migrations

'migrationName' 是您的迁移名称。
'MyProject.Data' 是 DBContext 所在的层。
'MProject.Web' 是您的 Web 项目。


0
在我的情况下,问题是启动程序没有按照程序中设定的方式被检测到:
public static IWebHostBuilder CreateWebHostBuilder(string[] args, Type startup)
{
   return WebHost.CreateDefaultBuilder(args).UseStartup(startup);
}

直接传递类型解决了问题:

.UseStartup<Startup>()

0

另一个检查是确保程序能首先运行。出于未知的原因,如果程序崩溃了,EF 迁移构建器不会通知您。因此,在旁边运行程序以检查是否会在开始时抛出异常。


0
我遇到了同样的错误,但我尝试做了不同的操作。我分享了我的经验,希望能帮到其他人。
最初的结果是
dotnet ef migrations bundle
Build started...
Build succeeded.
Unable to create an object of type 'Di2Context'. For the different patterns `supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728`

然后我运行了dotnet ef migrations bundle --verbose来查看完整的详细错误信息。
在我的解决方案中有几个项目,如Api、Domain、Infrastructure、Persistent等。我在Persistent项目中运行这个命令,因为它有migration.cs文件。
当我进入Api项目(我的启动项目)并运行时,
dotnet ef migrations bundle --self-contained -r linux-x64

创建了迁移 efbundle.exe,没有任何问题。

-1

我遇到了同样的错误。

实体框架工具版本“6.0.1”比运行时“6.0.6”旧。升级工具以获取最新功能和错误修复。

我更新了该程序包,问题得以解决。


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