重新创建表与实体框架5的NuGet(Re-create table with Entity Fram

2019-07-03 20:45发布

我使用的代码首先创建一个表。

我创建的类,映射文件和授权的NuGet附加转移命令,然后更新数据库命令

然后,我改变了类,并像一个白痴删除的表。

我删除了迁移类文件

我发出一个附加迁移命令

当我发出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, Action 1个wrapCloseInAction)在System.Data.SqlClient.TdsParser .ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand的cmdHandler,SqlDataReader的数据流,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布尔逻辑dataReady)在System.Data.SqlClient.SqlCommand。 RunExecuteNonQueryTds(字符串方法名,布尔异步,的Int32超时)在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(IEnumerable 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(IEnumerable 1个migrationStatements)在System.Data.Entity的.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable的1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable在System.Data.Entity.Migrations 1个操作,布尔降级,布尔自动) .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)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1个pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
在System.Data.Entity.Migrations.DbMigrator.Update(字符串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重建表?

Answer 1:

我发现我的答案。

我在[DBO]删除的行。[__ MigrationHistory]这相当于我的迁移

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

我重新运行添加迁移

然后重新运行更新的数据库-verbose



Answer 2:

还有我一直在我阿森纳代码优先迁移几个选项,它们取决于为什么你需要删除表或删除记录。 这里是我的方法:

  • 如果修改了模型和映射导致阻止你不能够更新表,你可以使用SQL管理服务器工作室删除整个数据库和删除迁移的文件夹 ,您可能希望保存一个脚本来重新填充错误使用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”,然后重新运行“添加-迁移new_example.cs “一次。 这使数据库恢复到它的初始快照

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



Answer 3:

你可以只删除数据库,然后从包管理器控制台运行“更新数据库”命令,都将被重新创建,包括你做任何更新。



文章来源: Re-create table with Entity Framework 5 and nuget