[英]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-migrations
和update-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.