16

我正在使用 Code First 创建一个表。

我创建了类、映射文件并在 nuget 中发出了 add-migration 命令,然后是 update-database 命令

然后我改变了班级,像个白痴一样删除了桌子。

我删除了迁移类文件

我发出了一个 add-migration 命令

当我发出 update-database 命令时,出现以下错误:

System.Data.SqlClient.SqlException (0x80131904):找不到对象“dbo.CorrectiveActionPlan”,因为它不存在或您没有权限。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,操作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject state&Obj, Boolean dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout) 在 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.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.ExecuteStatements(IEnumerable1 migrationStatements) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase。 ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerableSystem.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 在 System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 的 1 个操作,布尔降级,布尔自动System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1 pendingMigrations,字符串 targetMigrationId,字符串 lastMigrationId)1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable

在 System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 在 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore () 在 System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() ClientConnectionId:a6e92a35-cc9e-4867-97a5-0a274081d853 找不到对象“dbo.CorrectiveActionPlan”,因为它不存在或您没有权限。

如何强制 EF 重新创建表?

4

3 回答 3

33

我找到了我的答案。

我删除了 [dbo].[__MigrationHistory] ​​中与我的迁移相对应的行

然后我删除了新的迁移文件

我重新运行了添加迁移

然后重新运行 update-database -verbose

于 2012-11-15T07:05:01.863 回答
0

我为代码优先迁移保留了一些选项,它们取决于您需要删除表或删除记录的原因。这是我的方法:

  • 如果您修改了模型并且映射导致错误导致您无法更新表,您可以使用 SQL Management Server Studio 删除整个数据库并删除迁移文件夹您可能需要保存脚本以重新填充您的测试数据使用 sql 脚本或保存您的 Configuration.cs 文件,当您执行更新数据库命令时,数据将被重新填充。

    下面是一个存储过程的脚本示例,它只删除表数据:

    USE [DatabaseName]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[sp_DeleteAllYardPenaltyRecords]
    AS
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
    EXEC sp_MSForEachTable 'DELETE FROM ?'
    EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
    EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
    
  • 如果您只想删除数据,可以使用包管理器控制台命令:PM> Update-Database -TargetMigration $InitialDatabase& 删除创建的迁移文件,即:“201502210525393_example_with_error.cs”并再次重新运行“Add-Migration new_example.cs”。这会将数据库恢复到其初始快照

  • 或者您可以使用您的方法:删除[dbo].[__MigrationHistory]& 迁移文件中的行,即:'201502210525393_example_with_error.cs' 然后重新运行add-migrationupdate-database

于 2015-06-26T02:48:24.967 回答
-1

您可以删除数据库,然后从包管理器控制台运行“update-database”命令,所有内容都将重新创建,包括您所做的任何更新。

于 2015-03-12T00:00:53.130 回答