运行更新数据库时出错

Posted

技术标签:

【中文标题】运行更新数据库时出错【英文标题】:Error while running Update-Database 【发布时间】:2014-02-27 12:49:48 【问题描述】:

运行Update-Database -Verbose时出现以下错误:

使用启动项目“WebApplication”。使用 NuGet 项目 'Web应用程序'。指定“-Verbose”标志以查看 SQL 应用于目标数据库的语句。目标数据库是: “星冰乐”(数据源:(Localdb)\v11.0,提供者: System.Data.SqlClient,来源:配置)。没有待处理的显式 迁移。应用自动迁移: 201402032027563_AutomaticMigration。 ALTER TABLE [dbo].[Clients] ALTER COLUMN [ID] [int] NOT NULL System.Data.SqlClient.SqlException (0x80131904):对象“PK_dbo.Clients”依赖于“ID”列。 对象“FK_dbo.Users_dbo.Clients_Client_ID”取决于列 'ID'。 ALTER TABLE ALTER COLUMN ID 失败,因为一个或多个对象 访问此列。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串 方法名,布尔异步,Int32 超时,布尔异步写入)在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch[TInterceptionContext,TResult](Func1 operation, TInterceptionContext interceptionContext, Action1 执行,动作1 executed) at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements,DbConnection 连接)在 System.Data.Entity.Migrations.DbMigrator.c_DisplayClass32.b_2e() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.c_DisplayClass1.b_0() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 迁移声明)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1 操作, IEnumerable1 systemOperations, Boolean downgrading, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable1 pendingMigrations, 字符串 targetMigrationId, 字符串 lastMigrationId) 在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, 字符串 targetMigrationId, 字符串 lastMigrationId) 在 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(字符串 目标迁移)在 System.Data.Entity.Migrations.DbMigrator.c_DisplayClassc.b_b() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.DbMigrator.Update(字符串 目标迁移)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串 目标迁移)在 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() 在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner 亚军)在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串 targetMigration,布尔力)在 System.Data.Entity.Migrations.UpdateDatabaseCommand.c_DisplayClass2.<.ctor>b_0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作 命令)ClientConnectionId:9854ba62-772c-4ba6-b185-ecae993e065f 对象“PK_dbo.Clients”取决于“ID”列。物体 “FK_dbo.Users_dbo.Clients_Client_ID”取决于“ID”列。 ALTER TABLE ALTER COLUMN ID 失败,因为一个或多个对象访问 本栏目。

在此之前我所做的是将我的 Code-First Model 类中的 ID 变量从 Int16 更改为 Int32

有什么帮助吗?

【问题讨论】:

【参考方案1】:

看起来数据库无法更改/删除 ID 列,因为另一个表具有引用 ID 列的外键。如果您删除引用,更新列,然后重新添加引用,您应该可以继续...

【讨论】:

如何重新创建数据库?我已经删除它来试试你说的,现在我无法恢复它。 你删除了整个数据库?如果是这样,当您运行应用程序时,应由实体框架在您指定的位置重新创建数据库。我相信默认位置是 SQL Express。你用的是什么数据库?您之前是如何创建数据库的? 我是使用Code-First创建的,所以我没有接触任何数据库相关 编辑:运行应用程序后,唯一的表创建的是_MigrationHistory。我猜我现在遇到了更大的问题。 问题已解决:删除所有迁移相关文件夹、文件和表后,我重新启用Migrations 并像您一样重新填充数据库我说过。 当列有约束时,我也遇到了这个问题,迁移会失败,因为 EntityFramework 未能删除列上的约束。为了解决这个问题,我修改了迁移脚本以在尝试重新创建之前删除该列。【参考方案2】:

问题已解决:删除所有与迁移相关的文件夹、文件和表后,我重新启用迁移并按照您所说的重新填充数据库

在已接受的答案的基础上,以下是在不放弃所有迁移或手动编辑迁移的情况下解决该问题的具体步骤。

在我的情况下,我有

public class Parent

    public virtual ICollection<Child> A  get; set; 

必须将孩子的类型从 Child 更改为 OtherChild。那是我遇到错误的时候。

为了解决这个问题,我创建了两个迁移。第一个简单地从 EF 中取消映射属性 A。我也可以将其注释掉,但相当多的访问该属性的代码将无法编译。

public class Parent

    [NotMapped]
    public virtual ICollection<Child> A  get; set; 

添加迁移 UnmapA

更新数据库

然后我重新映射了属性并更改了类型

public class Parent

    public virtual ICollection<OtherChild> A  get; set; 

add-migration ChangeChildType

更新数据库

【讨论】:

以上是关于运行更新数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章

通过命令行在 BigQuery 中加载数据时出错:已更新

在 Intellij 中更新 Kotlin 后在 Eclipse 中运行应用程序时出错

更新 WAMP 后尝试访问数据库时出错

使用 DataGrid 更新访问表时出错

使用 Matlab 更新 MS Access 时出错

更新表时 H2 数据库“重命名文件时出错”