实体框架代码迁移:调用的目标引发了异常

本文关键字:目标 异常 调用 框架 代码 迁移 实体 | 更新日期: 2023-09-27 18:29:10

我在MVC项目中使用代码优先实体框架5。今天,我对我的域模型进行了一些更改,并更新了应用程序的其余部分来处理这些新的更改。当然,当对域模型进行更改时,您需要更新数据库。我们使用代码迁移来做到这一点(即手动迁移)。然而,当我试图通过包控制台添加新的迁移时,我得到了以下异常:

调用的目标引发了异常。

我尝试将启动项目添加到命令中,但也没有成功。我的所有项目都是构建的,所以也没有编译器错误。

编辑:而且,无论我做什么,都会发生这种情况:更新数据库或使用目标迁移更新数据库。所有这些似乎都给了我同样的例外。

这是调用堆栈:

PM>添加迁移MyMigrationNameSystem.Reflection.TargetInvocationException:调用的目标引发了异常--->

System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException:无法更新数据库以匹配当前模型,因为存在挂起的更改,并且已禁用自动迁移。将挂起的模型更改写入基于代码的迁移,或者启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true可启用自动迁移。

位于System.Data.Entity.Migrations.DbMigrator.Update(IEnumerable 1 pendingMigrations, String targetMigrationId, String lastMigrationId) at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) at System.Data.Entity.MigrateDatabaseToLatestVersion 2.InitializeDatabase(TContext上下文)位于System.Data.Entity.Database。<gt;c_DisplayClass2 1.<SetInitializerInternal>b__0(DbContext c) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6() at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) at System.Data.Entity.Internal.RetryAction 1.执行操作(输入)位于System.Data.Entity.Interal.LazyInternalContext.InitialDatabaseAction(操作`1操作)位于System.Data.Entity.Interal.LazyInternalContext.InitialDatabase()位于System.Data.Entity.InteralInternalContext.ForceSpaceLoadingForKnownEntityTypes()位于System.Data.Entity.DbContext.System.Data.Entity.IOBbjectContextAdapter.get_ObjectContext()位于EntityFramework.Audit.AuditLogger.ctor(DbContext DbContext,AuditConfiguration配置)位于EntityFramework.Extensions.AuditExtensions.BeginAudit(DbContext DbContext,AuditConfiguration配置)位于c:..中的Project.DataAccessLogic.MyContext.ctor()。。''MyContext.cs:line 125---内部异常堆栈跟踪结束---位于System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔publicOnly,布尔noCheck,布尔&canBeCached,RuntimeMethodHandleInternal&ctor,布尔&aamp;bNeedSecurityCheck)在System.RuntimeType.CreateInstanceSlow(布尔publicOnly、布尔skipCheckThis、布尔fillCache、StackCrawlMark和stackMark)位于System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly、布尔skipCheckThis、布尔fillCache、StackCrawlMark和stackMark)位于System.Activator.CreateInstance(类型类型,布尔值非公共)位于System.Activator.CreateInstance(类型类型)位于System.Data.Entity.Infrastructure.DbContextInfo.b_0()位于System.Data.Entity.Infrastructure.DbContextInfo.ctor(类型contextType,DbProviderInfo模型ProviderInfo,AppConfig配置,DbConnectionInfo连接信息)位于System.Data.Entity.Infrastructure.DbContextInfo.ctor(类型contextType)位于System.Data.Entity.Migrations.DbMigrator.ctor(DbMigrationsConfiguration配置,DbContext usersContext)位于System.Data.Entity.Migrations.DbMigrator.ctor(DbMigrationsConfiguration配置)位于System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator()位于System.Data.Entity.Migrations.Design.ToolingFacade.GetPendingMigrationsRunner.RunCore()位于System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()调用的目标引发了异常。

我不知道该从哪里开始找。

实体框架代码迁移:调用的目标引发了异常

如果我没有正确设置连接字符串,就会出现此错误。

请确保Web.config中的以下内容正确无误:

  1. 数据源
  2. 初始目录
  3. 用户Id
  4. 密码

在从模型更新/生成表时遇到了同样的问题。解决方案是将app.config连接字符串中的句点替换为SQL Server实例的实际计算机名。

有点晚了,但也许这对某人有帮助。

你可以检查的几件事:

  • 确保连接到正确的数据库:确保在控制台Default project下拉列表中选择了正确的项目,或明确使用参数-StartUpProjectName。此项目的设置中必须包含正确的连接字符串。也可以显式设置-ConnectionString参数。

  • 如果您的解决方案有一个启动项目,即使您在控制台Default project下拉列表或参数-StartUpProjectName中声明了不同的项目,控制台也会使用其连接字符串。确保解决方案中有正确的启动项目。另一种方法是在解决方案配置选项中选择Multiple startup projects。在这种情况下,控制台将接受您提供的值,而不是在解决方案启动项目中查找连接字符串。

  • 也许您当前的数据库与您当前的上一次迁移(您试图生成的新迁移之前的迁移)不同步。请尝试运行Get-Migrations以查看当前应用于数据库的迁移。如果不是最新的迁移,请使用参数-SourceMigration-TargetMigration运行Update-Database,以将其更新为最新迁移。

我通过将实体框架NuGet软件包更新到3.1.3版本来解决这个问题即:

  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.AspNetCore.Identity EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SQL服务器

由于源代码中的分支,我得到了异常。

  1. 切换到分支功能
  2. 创建了代码迁移
  3. 已将更改应用于数据库
  4. 切换到默认

项目中没有代码迁移,但数据库中包含有关它的信息。

即使__Migrations表和/Migrations-cs文件同步,我也遇到了这个问题。最近也没有进行迁移。我用Add-Migration "Anything""修复"了它。然后我刚刚删除了新搭建的空CS和设计器文件。

我通过添加--context并指定数据库上下文类名来解决这个问题。

使用以下最新的稳定版本解决了我的问题。

Microsoft.EntityFrameworkCore.SqlServer (5.0.0)
Microsoft.EntityFrameworkCore.Tools (5.0.0)

异常是因为以下版本需要相同。

  1. Microsoft.EntityFrameworkCore.SQL服务器
  2. Microsoft.EntityFrameworkCore.Tools
  3. Microsoft.EntityFrameworkCore

所以,无论你使用什么版本,只要确保它们匹配,你就可以使用了。

更新"Microsoft.EntityFrameworkCore.SqlServer"answers"Microsoft.EntityFrameworkCore.Tools"更新到最新的框架版本(dotnet5、dotnet6等),然后再次运行迁移。在我的情况下,然后遇到"不止一个DbContext被找到"。指定要使用的。对PowerShell命令使用'-Context'参数,对dotnet命令使用'-Context'参数。',然后我使用Get-DbContext来获取所涉及的上下文类,然后我指定目标上下文类,如"add migration InitialIdentityServerMigration-context PersistedGrantDbContext"