【问题标题】:Re-create table with Entity Framework 5 and nuget使用 Entity Framework 5 和 nuget 重新创建表
【发布时间】:2012-11-15 06:39:53
【问题描述】:

我正在使用 Code First 创建表。

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

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

我删除了迁移类文件

我发出了添加迁移命令

当我发出更新数据库命令时,我收到以下错误:

System.Data.SqlClient.SqlException (0x80131904):找不到 对象“dbo.CorrectiveActionPlan”,因为它不存在或者你存在 没有权限。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 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.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 迁移声明)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1 操作,布尔值 降级,布尔自动)在 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(IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, 字符串 targetMigrationId, 字符串 lastMigrationId)
在 System.Data.Entity.Migrations.DbMigrator.Update(字符串 目标迁移)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串 目标迁移)在 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 重新创建表?

【问题讨论】:

    标签: entity-framework nuget entity-framework-migrations


    【解决方案1】:

    我找到了答案。

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

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

    我重新运行了添加迁移

    然后重新运行 update-database -verbose

    【讨论】:

    • 你为我节省了很多时间!
    • 你也为我节省了大量时间! :))
    • 你是丛林之王!
    • 就我而言,它仅在我放下那张桌子后才起作用,但感谢您为我指明了正确的方向!
    • 手头主题的便捷链接 - msdn.microsoft.com/en-us/data/jj591621.aspx
    【解决方案2】:

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

    • 如果您修改了模型并且映射导致错误导致您无法更新表,您可以使用 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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 除非里面有需要的数据。
      • @Eric:是的,但我直接回答了他的问题(如何强制 EF 重新创建表?) - 关键字是“重新创建”
      • 是的,但不是每个来这里的人都和 OP 的情况完全相同。刚刚为其他找到答案的人添加了警告(也不是我的反对意见)。
      猜你喜欢
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2023-03-03
      • 2013-02-26
      • 2013-04-19
      • 1970-01-01
      相关资源
      最近更新 更多