繁体   English   中英

在实体框架中无需迁移即可更新数据库

[英]Update database without migration in Entity Framework

我在 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 )的情况下update-database

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

Database.SetInitializer<YourContext>(null);

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

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

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

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
  public Configuration()
  {
    AutomaticMigrationsEnabled = true;
  }

  protected override void Seed(ApplicationDbContext context)
  { 
  }
}

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

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);

使用 EF6:

我认为你可以做些什么来在你的DbContext类构造函数中使用Database.SetInitializer来在第一次运行时创建数据库。 这个我猜你已经有了,接下来你可以评论它,它说Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>());

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM