我从 EF 和 MVC 开始,并且遵循不同的教程提供了不同的令人困惑的想法,即在我的数据库中放置虚拟测试数据的正确位置是哪里。
所以我做了一些 POCO 类,我有一个 BlahContext
public class BlahContext : DbContext
{
public DbSet<Blah> Blahs { get; set; }
public BlahContext() : base("DefaultConnection")
{
Configuration.ProxyCreationEnabled = false;
}
}
然后在 Global.asax.cs 我像这样初始化数据库:
protected void Application_Start()
{
Database.SetInitializer(new DropCreateDatabaseAlways<BlahContext>());
}
现在我在包管理器控制台中做了以下事情:
PM> enable-migrations -contexttypename Blah.Models.BlahContext
PM> add-migration Initial
PM> update-database
这创建了 Configuration.cs,并且在该类中有一个 Seed() 方法 - 生成的注释暗示这是放置种子数据的正确位置。所以我这样填写:
internal sealed class Configuration : DbMigrationsConfiguration<Blah.Models.BlahContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Blah.Models.BlahContext context)
{
#if DEBUG
context.Blahs.AddOrUpdate(b => b.ID,
new Blah() { ID = 1, Name = "bum", },
new Blah() { ID = 2, Name = "moo", }
);
#endif
}
}
现在,当我update-database
再次运行时,它会在 Blah 表中填充 2 条记录“bum”和“moo”。都好。
但是当我运行应用程序时,似乎Database.SetInitializer()
调用Application_Start
会导致重新创建数据库,但这次没有调用该Configuration.Seed()
方法。所以数据不再存在。
我看到了其他一些创建类的教程,例如:
class BlahContextInitializer : DropCreateDatabaseAlways<BlahContext>
然后 Application_Start 看起来像:
protected void Application_Start()
{
Database.SetInitializer(new BlahContextInitializer());
}
然后在BlahContextInitializer.Seed()
包含虚拟数据的方法中。此策略仅适用于 EF4.1 吗?
我应该将我的种子数据放在 EF5 中的哪个位置,以便在应用程序启动时它不会被清除?