运行更新数据库时出错
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, Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 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.InternalDispatcher
1.Dispatch[TInterceptionContext,TResult](Func1 operation, TInterceptionContext interceptionContext, Action
1 执行,动作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(IEnumerable
1 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(IEnumerable
1 迁移声明)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1 操作, 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(IEnumerable
1 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
更新数据库
【讨论】:
以上是关于运行更新数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章