实体框架代码迁移:调用的目标引发了异常
本文关键字:目标 异常 调用 框架 代码 迁移 实体 | 更新日期: 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_DisplayClass21.<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中的以下内容正确无误:
- 数据源
- 初始目录
- 用户Id
- 密码
在从模型更新/生成表时遇到了同样的问题。解决方案是将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服务器
由于源代码中的分支,我得到了异常。
- 切换到分支功能
- 创建了代码迁移
- 已将更改应用于数据库
- 切换到默认
项目中没有代码迁移,但数据库中包含有关它的信息。
即使__Migrations
表和/Migrations-cs文件同步,我也遇到了这个问题。最近也没有进行迁移。我用Add-Migration "Anything"
"修复"了它。然后我刚刚删除了新搭建的空CS和设计器文件。
我通过添加--context并指定数据库上下文类名来解决这个问题。
使用以下最新的稳定版本解决了我的问题。
Microsoft.EntityFrameworkCore.SqlServer (5.0.0)
Microsoft.EntityFrameworkCore.Tools (5.0.0)
异常是因为以下版本需要相同。
- Microsoft.EntityFrameworkCore.SQL服务器
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore
所以,无论你使用什么版本,只要确保它们匹配,你就可以使用了。
更新"Microsoft.EntityFrameworkCore.SqlServer"answers"Microsoft.EntityFrameworkCore.Tools"更新到最新的框架版本(dotnet5、dotnet6等),然后再次运行迁移。在我的情况下,然后遇到"不止一个DbContext被找到"。指定要使用的。对PowerShell命令使用'-Context'参数,对dotnet命令使用'-Context'参数。',然后我使用Get-DbContext来获取所涉及的上下文类,然后我指定目标上下文类,如"add migration InitialIdentityServerMigration-context PersistedGrantDbContext"