我在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-migrations
和update-database
)的情况下更新数据库?
答案 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
中进行匹配。