【发布时间】:2013-05-14 22:09:08
【问题描述】:
我从 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() 方法 - 生成的 cmets 暗示这是放置种子数据的正确位置。所以我是这样填写的:
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”。都很好。
但是当我运行应用程序时,Application_Start 中的Database.SetInitializer() 调用似乎导致数据库被重新创建,但这次Configuration.Seed() 方法被不调用。所以数据不再存在。
我看到了其他一些创建类的教程,例如:
class BlahContextInitializer : DropCreateDatabaseAlways<BlahContext>
然后 Application_Start 看起来像:
protected void Application_Start()
{
Database.SetInitializer(new BlahContextInitializer());
}
然后在 BlahContextInitializer.Seed() 方法中包含虚拟数据。此策略是否仅适用于 EF4.1?
我应该将我的种子数据放在 EF5 中的哪个位置,这样它才不会在应用程序启动时被清除?
【问题讨论】:
标签: asp.net-mvc ef-code-first entity-framework-5