【发布时间】:2011-09-12 19:55:21
【问题描述】:
数据库已成功创建(与表一样),但未播种。我花了几个小时阅读了大量的文章,但一直没能得到它。有什么建议吗?
附带说明一下,是否可以调用初始化程序而无需在客户端中引用我的 DatabaseContext?
我已经包含了我能想到的所有相关代码。如果还有什么有用的,请告诉我。
我尝试过的事情:
- 我删除了我的连接字符串(因为无论如何它默认为 sqlexpress,只是名称已更改)
- 我将 DropCreateDatabaseIfModelChanges 更改为 DropCreateDatabaseAlways,还是一样。
编辑:真正奇怪的是它曾经工作过,但我不知道它是如何或为什么再次坏掉的。我假设连接字符串,但谁知道呢。
DatabaseInitializer.cs
public class DatabaseInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext>
{
protected override void Seed(DatabaseContext context)
{
// Seeding data here
context.SaveChanges();
}
}
DatabaseContext.cs
public class DatabaseContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder mb)
{
// Random mapping code
}
public DbSet<Entity1> Entities1 { get; set; }
public DbSet<Entity2> Entities2 { get; set; }
}
Global.asax.cs - Application_Start()
protected void Application_Start()
{
Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
客户端 web.config
<connectionStrings>
<add name="DatabaseContext" connectionString="data source=.\SQLEXPRESS;Database=Database;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
解决方案
为了文档,我在这里分享我的解决方案。无论如何,导航所有的 cmets 都会很痛苦。最后,我在不同的类中有 DatabaseInitializer 和 DatabaseContext。虽然这些微小的变化修复了它,但我真的不明白,但就是这样。
DatabaseInitializer.cs
public class DatabaseInitializer : CreateDatabaseIfNotExists<DatabaseContext>
{
protected override void Seed(DatabaseContext context)
{
// Seed code here
}
}
DatabaseContext.cs
public class DatabaseContext : DbContext
{
public DatabaseContext() : base("MyDatabase") { }
protected override void OnModelCreating(DbModelBuilder mb)
{
// Code here
}
public DbSet<Entity> Entities { get; set; }
// Other DbSets
}
Global.asax.cs - Application_Start()
protected void Application_Start()
{
Database.SetInitializer(new DatabaseInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
【问题讨论】:
-
您是否将种子项添加到您的数据上下文中?我知道我以前错过了。
-
是的,我是。感谢您的检查:)。
-
=D 不用担心。你能在代码中设置一个断点并确保你的 Seed 被调用吗?
-
没有调用 Seed 方法。 DatabaseInitializer 是。我错过了什么吗?
-
这真的很奇怪。尝试将 Database.SetInitializer 放入 DatabaseContext 的构造函数中。另外,尝试添加 base.Seed (context);到你的种子方法。我不知道为什么这很重要,但值得检查。编辑:我看到了您对@feanz 答案的评论,但您可以将 Database.SetInitializer 放入 datacontext 的构造函数中。我 acutlaly 将我的初始化程序类 inside 我的 datacontext 类。
标签: entity-framework asp.net-mvc-3 frameworks entity code-first