【问题标题】:Update database without migration in Entity Framework在实体框架中更新数据库而不迁移
【发布时间】:2021-06-03 20:11:10
【问题描述】:

我在 Visual Studio 中创建了一个 ASP.NET MVC 示例应用程序。我添加了两个类,如下所示:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
    public ICollection<Product> Products { get; set; }
}

public class Order
{
    public int Id{ get; set; }
    public Product Product { get; set; }
    public int ProductId { get; set; }
    public DateTime RegisterDate { get; set; }
}

然后我在主DbContext 中添加了两个DbSet,如下所示:

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public IDbSet<Product> Products { get; set; }
    public IDbSet<Order> Orders { get; set; }

    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

但是现在当我运行项目时,我得到了这个错误:

支持 'ApplicationDbContext' 上下文的模型在创建数据库后发生了变化

我只是想知道有没有办法在不使用迁移的情况下更新数据库(Add-migrationsupdate-database)?

【问题讨论】:

  • 我认为您正在寻找 DropCreateDatabaseIfModelChanges
  • 您可以按照 Rise 的建议使用 database initializer。这些对于早期开发很方便,并且有自己的种子方法。获得要保留的非种子数据后,您可以切换到迁移。使用 null 初始化器不会创建数据库对象 - 它会假定代码模型与数据库匹配(危险)。
  • 你可以删除dbo.__MigrationHistory试试。请看下面stackoverflow.com/a/67821254/3057246的回答@

标签: c# asp.net entity-framework


【解决方案1】:

您可以按照自己想要的方式更新数据库结构(查询、通过 DBMS 用户界面等等)。
如果这样做,您需要禁用配置检查。

Database.SetInitializer<YourContext>(null);

(我将这个插入到上下文中的静态构造函数中)

【讨论】:

    【解决方案2】:

    您可以启用自动迁移来实现此目的。这种方法肯定使用代码优先迁移,但您不需要使用 Add-Migration 命令或 update-database

    首先从包管理器控制台运行 Enable-Migrations –EnableAutomaticMigrations 以生成配置类,如下所示:

    internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
    {
      public Configuration()
      {
        AutomaticMigrationsEnabled = true;
      }
    
      protected override void Seed(ApplicationDbContext context)
      { 
      }
    }
    

    现在您可以更新 db 上下文的构造函数以迁移到最新版本,如下所示:

    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
       Database.SetInitializer(
                 new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
       this.Database.Initialize(true);
    }
    

    或在应用程序启动时迁移到最新版本,如下所示:

    using (var context = new ApplicationDbContext())
     {
        Database.SetInitializer(
                  new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
        context.Database.Initialize(true);
     }
    

    更新

    如果您根本不想使用迁移,您可以考虑将数据库初始化程序设置为 null 并使用脚本手动处理数据库迁移

    Database.SetInitializer<YourContext>(null);
    

    【讨论】:

    • “更新数据库不迁移”的答案是运行–EnableAutomaticMigrations?!?!
    • “我只是想知道有没有办法在不使用迁移(添加迁移和更新数据库)的情况下更新数据库?” - 这个问题给了我一个概念,即 OP 想要在不手动处理迁移的情况下完成它。而且没有提到 OP 想要使用脚本手动处理迁移。无论如何,我已经更新了答案。 .感谢您指出!
    【解决方案3】:

    使用 EF6:

    我认为您可以在DbContext 类构造函数中使用Database.SetInitializer 来在第一次运行时创建数据库。这个我猜你已经有了,接下来你可以评论它上面写着Database.SetInitializer&lt;MyContext&gt;(new CreateDatabaseIfNotExists&lt;MyContext&gt;());

    并删除在您的数据库中创建的dbo.__MigrationHistory 表。

    现在您可以使用Alter Table.. 在您的数据库表中添加删除列,然后在您的C# Table class 中进行匹配。

    【讨论】:

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