对于MVC5网站,我想使用实体框架数据库初始化程序,该初始化程序使用一些初始值创建和播种数据库。接下来我要保留一个迁移列表,我希望在创建初始数据库时以受控方式运行这些迁移(带有一些初始值)。但无论我尝试什么,迁移都会在创建和播种初始数据库之前执行。经过大量尝试和阅读帖子后,我得到了以下代码:
在global.asax.cs中:
@ok1@
identifier i1,i2;
position p;
@@
struct i1 i2@p = { \(0\|NULL\) };
@ok2@
identifier i1,i2,i3;
position p;
expression e;
@@
struct i1 i2@p = { ..., .i3 = e, ... };
@ok3@
identifier i1,i2;
position p;
@@
struct i1 i2@p = { ..., { ... }, ... };
@decl@
identifier i1,fld;
type T;
field list[n] fs;
@@
struct i1 {
fs
T fld;
...};
@bad@
identifier decl.i1,i2;
expression e;
position p != {ok1.p,ok2.p,ok3.p};
constant nm;
initializer list[decl.n] is;
position fix;
@@
struct i1 i2@p = { is,
(
nm(...)
|
e@fix
)
,...};
@@
identifier decl.i1,i2,decl.fld;
expression e;
position bad.p, bad.fix;
@@
struct i1 i2@p = { ...,
+ .fld = e
- e@fix
,...};
初始化看起来如下:
Database.SetInitializer(new App_Start.ProjectHoursDatabaseInitializer());
迁移配置如下所示:
public class ProjectHoursDatabaseInitializer : IDatabaseInitializer<ProjectHoursDbContext>
{
public void InitializeDatabase(ProjectHoursDbContext context)
{
if (context.Database.Exists())
{
if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false))
{
var migrator = new DbMigrator(new ProjectHours.Migrations.Configuration());
migrator.Update();
}
}
else
{
context.Database.Create();
// The problem is that migrations are executed at this point
// The migrations must not run (cannot run),
// The only thing that must happen is creating tables
// and inserting some initial data.
SeedDatabase(context);
context.SaveChanges();
}
}
}
问题在于,无论我尝试什么,都会在尚未创建初始数据库的情况下执行迁移。我不明白这一点。在配置中,它明确指出应禁用自动迁移。 看起来并非如此。有什么想法吗?
答案 0 :(得分:0)
你有没有尝试过:Database.SetInitializer<ProjectHoursDbContext>(new CreateDatabaseIfNotExists());
你Global.asax?
答案 1 :(得分:0)
最终,我通过使用迁移而不是尝试组合初始化程序和迁移来解决问题。我创建了从包管理器创建数据库的初始迁移: 启用的迁移 add-migration InitialCreate
从那时起,我按照本文中的步骤获得了一个可用于创建初始数据库或升级现有生产数据库的工作解决方案:https://galleryserverpro.com/using-entity-framework-code-first-migrations-to-auto-create-and-auto-update-an-application/