【问题标题】:How to update database using entity framework without migration history如何使用没有迁移历史的实体框架更新数据库
【发布时间】:2019-02-28 07:32:27
【问题描述】:

我的应用程序处于运行状态并且工作正常。我也有我的项目文件夹。

现在我在该项目中更新并创建了更多tables。不幸的是,我已经删除了迁移文件夹中的迁移文件。

现在我有一个数据库,在migration history table 中我最近迁移了历史记录行。但是如上所述,我的项目文件夹中不存在该文件。

现在,如果我正在运行 add-migration,它将从头开始创建整个数据库,而不是通过在迁移文件中创建附加表来更新它。

有什么办法可以解决我的问题吗?

【问题讨论】:

    标签: c# sql-server asp.net-mvc entity-framework


    【解决方案1】:

    我用一个非常简单的 DbContext 对此进行了测试。我希望这对你有用。

    基本上,您需要在当前状态下创建数据库的新快照,并使用它来创建初始迁移。之后,您可以正常创建迁移。

    1. 备份您的数据库备份您的项目,然后删除您的 Migrations 文件夹(如果有)。

    2. 从您的数据库构建一个临时模型和上下文。您可以从项目文件夹中的命令行运行它。

    dotnet ef dbcontext scaffold "{Your connection string}" Microsoft.EntityFrameworkCore.SqlServer -o TempModels -c ApplicationDbContext
    

    确保 -c 与现有 DbContext 的名称和提供者的名称相匹配,例如。 SqlServer 与您的数据库提供程序匹配。

    这将在您的项目中创建一个名为 TempModels 的文件夹,并在 TempModels 命名空间中创建一个新的 DbContext。

    您可以在https://docs.microsoft.com/en-us/ef/core/managing-schemas/scaffolding 阅读更多关于对数据库进行逆向工程的信息。

    1. 使用此新上下文创建新迁移
    PM> add-migration Initial -Context YourApplicationName.TempModels.ApplicationDbContext
    
    1. 删除 TempModels 文件夹

    2. 手动将刚刚创建的迁移的 .cs 文件名添加到 dbo.__EFMigrationsHistory。这样update-database 就不会尝试应用我们在上一步调用时所做的迁移。

    例子:

    1. 在您的迁移 .designer.cs 和 ModelSnapshot 文件中,您必须更改 DbContext 的命名空间
    // change this
    using MyApplication.TempModels
    
    // to whatever name space your real dbcontext lives in
    using MyApplication.Data
    
    
    1. 创建另一个迁移。这将包含您的原始 DbContext 与您从数据库中搭建的临时 DbContext 的差异。然后使用它来更新您的数据库。
    PM> add-migration 1
    
    PM> update-database
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-08
      • 2017-04-08
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      相关资源
      最近更新 更多