在Entity Framework中更新数据库而不迁移

时间:2017-08-05 07:48:13

标签: c# asp.net 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; }
}

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

 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)的情况下更新数据库?

3 个答案:

答案 0 :(得分:4)

You can update the database structure in the way you want (queries, via DBMS user interface and so on).
If you do so you need to disable configuration check.

Database.SetInitializer<YourContext>(null);

(I insert this in a static constructor in the context)

答案 1 :(得分:1)

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

首先从包管理器控制台运行启用 - 迁移-EnableAutomaticMigrations 以生成Configuration类,如下所示:

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

答案 2 :(得分:0)

使用 EF6:

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

的地方评论它

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

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