我正在使用Code First创建一个表。
我创建了类,映射文件并在nuget中发出了add-migration命令,然后是update-database命令
然后我改变了课程,像一个白痴一样删掉了桌子。
我删除了迁移类文件
我发出了一个添加迁移命令
当我发出update-database命令时,出现以下错误:
System.Data.SqlClient.SqlException(0x80131904):找不到 对象" dbo.CorrectiveActionPlan"因为它不存在或你这样做 没有权限。在 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)at 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.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(IEnumerable
1 migrationStatements)at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1次操作,布尔值 降级,布尔自动)at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration 迁移,DbMigration lastMigration) System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration 迁移,DbMigration lastMigration) System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable的1 pendingMigrations, String targetMigrationId, String 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(字符串 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重新创建表格?
答案 0 :(得分:33)
我找到了答案。
我删除了[dbo]中的行。[__ MigrationHistory]对应于我的迁移
然后我删除了新的迁移文件
我重新运行了添加迁移
然后重新运行update-database -verbose
答案 1 :(得分:0)
我在代码优先迁移中保留了一些选项,它们取决于您需要删除表或删除记录的原因。这是我的方法:
如果您修改了模型并且映射导致错误,导致您无法更新表,则可以使用SQL Management Server Studio&删除整个数据库。删除迁移文件夹您可能希望保存脚本以使用sql脚本重新填充测试数据或保存Configuration.cs文件,并在执行update database命令时重新填充数据。 / p>
以下是存储过程只删除表数据的脚本示例:
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-migration
和update-database
答案 2 :(得分:-1)
您可以删除数据库然后从包管理器控制台运行'update-database'命令,所有这些都将被重新创建,包括您所做的任何更新。