我在实体框架中使用Code First方法。
我已经创建了一个自定义数据库初始化程序,如下所示。
public class CustomInit : IDatabaseInitializer<APIContext>
{
public void InitializeDatabase(APIContext context)
{
bool dbExists;
dbExists = context.Database.Exists();
if (dbExists)
{
// remove all tables
context.Database.ExecuteSqlCommand(
"EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\"");
// create all tables
var dbCreationScript = ((IObjectContextAdapter)
context).ObjectContext.CreateDatabaseScript();
context.Database.ExecuteSqlCommand(dbCreationScript);
context.SaveChanges();
}
else
{
throw new ApplicationException("No database is present");
}
}
}
根据上面的代码,删除并重新创建数据库中的所有表。
我需要做的是删除并创建在代码中更改的表/实体 喜欢 - 添加或删除任何列等。
无论如何我们可以这样做吗?
非常感谢任何指导。
答案 0 :(得分:1)
您可以使用migrations更新数据库方案。
当然,您不应该使用自定义数据库初始化程序。
答案 1 :(得分:0)
最简单的解决方案是在您的上下文构造函数中添加此初始化:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
每次运行程序时,都会根据数据库检查模型,如果模型已被修改,则自动删除并重新创建数据库。
如果您不想删除数据库,只需更新数据库,那么您可以使用以下初始化:
Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, Config>());
但请注意,这些都不适用于Entity Framework Core ,因为Microsoft并不打算为.Net Core版本实现自动迁移。
答案 2 :(得分:0)
您可以通过更新数据库恢复已应用的初始迁移。
更新数据库-targetMigration“MigrationName”
上面的命令会恢复所有数据库更改,无论您在EF迁移过程中应用了什么。