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

5

我在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)?


2
我认为你正在寻找DropCreateDatabaseIfModelChanges。 - cuongtd
1
你可以像Rise建议的那样使用数据库初始化器。这些对于早期开发非常方便,并且具有自己的种子方法。一旦你获得了想要保留的非种子数据,就可以切换到迁移。使用空初始化器不会创建数据库对象-它将假定代码模型与数据库匹配(危险)。 - Steve Greene
您可以删除 dbo.__MigrationHistory 并尝试。请参见下面的答案 https://dev59.com/6qTia4cB1Zd3GeqP8BTy#67821254 - Vinod Srivastav
3个回答

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

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

4

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

首先从程序包管理器控制台运行Enable-Migrations - EnableAutomaticMigrations,生成一个如下的配置类:

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

“无需迁移更新数据库”的答案是运行 –EnableAutomaticMigrations?!?!” - Kenneth K.
我只是想知道是否有一种方法可以在不使用迁移(Add-migrations和update-database)的情况下更新数据库?这个问题让我觉得OP想要在不手动处理迁移的情况下完成它...而且没有提到OP想要使用脚本手动处理迁移..无论如何,我已经更新了答案..感谢指出! - ashin

2

使用EF6:

我认为您可以在DbContext类构造函数中使用Database.SetInitializer创建数据库并在第一次运行时进行设置。我想这是您已经拥有的,接下来您可以将其注释掉,其中写着Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>());

然后删除数据库中创建的dbo.__MigrationHistory表。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接