运行Update-Database时出错

时间:2014-02-03 20:49:17

标签: asp.net-mvc entity-framework ef-migrations

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

  

使用StartUp项目'WebApplication'。使用NuGet项目   'Web应用程序'。指定'-Verbose'标志以查看SQL   语句被应用于目标数据库。目标数据库是:   'Frappuccino'(DataSource:(Localdb)\ v11.0,提供者:   System.Data.SqlClient,Origin:Configuration)。没有未决的明确   迁移。应用自动迁移:   201402032027563_AutomaticMigration。 ALTER TABLE [dbo]。[客户] 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异常,   布尔值breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)at   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject   stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)at   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,   SqlCommand cmdHandler,SqlDataReader dataStream,   BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject   stateObj,布尔& dataReady)at   System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串   methodName,Boolean async,Int32 timeout,Boolean asyncWrite)at   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 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](Func键1 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连接)at   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](Func键1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable 1   migrationStatements)at   System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable 1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable 1个操作,   IEnumerable的1 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,String targetMigrationId,String lastMigrationId)
  在   System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1   pendingMigrations,String targetMigrationId,String lastMigrationId)
  在System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String   targetMigration)   System.Data.Entity.Migrations.DbMigrator<> C_ DisplayClassc.b _b()   在   System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(动作   mustSucceedToKeepDatabase)at   System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(动作   mustSucceedToKeepDatabase)at   System.Data.Entity.Migrations.DbMigrator.Update(字符串   targetMigration)   System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串   targetMigration)   System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()   在System.AppDomain.DoCallBack(CrossAppDomainDelegate   callBackDelegate)at   System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
  在System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner)   跑者)   System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串   targetMigration,Boolean force)at   System.Data.Entity.Migrations.UpdateDatabaseCommand<> C_ DisplayClass2< .ctor&GT,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失败,因为一个或多个对象访问   这一栏。

在此之前我要做的是将{{1>}变量从我的代码优先模型类从ID更改为Int16

请帮忙吗?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

  

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

根据已接受的答案,以下是解决问题的具体步骤,而不会删除所有迁移或手动编辑迁移。

在我的情况下,我有

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

     

更新的数据库