数据库已成功创建(与表一样),但未设定种子。我花了几个小时,阅读了大量的文章,但还是没能读懂。有什么建议吗?
顺便说一句,是否可以在不引用客户端中的DatabaseContext的情况下调用初始化器?
我已经包含了我能想到的所有相关代码。如果还有什么需要帮助的,请让我知道。
我尝试过的东西:
编辑:真正奇怪的是,它曾经工作过一次,但我不知道它是如何或为什么再次损坏的。我假设是连接字符串,但谁知道呢。
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>
解决方案
为了便于文档记录,我在这里分享我的解决方案。无论如何,浏览所有的评论将是一件痛苦的事情。最后,我将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);
}
发布于 2011-06-14 01:35:58
这就是我的DbContext类的样子,它们的种子都很好:
public class MyDbContext : DbContext
{
public DbSet<MyClass> MyClasses { get; set; }
protected override void OnModelCreating (DbModelBuilder modelBuilder)
{
base.OnModelCreating (modelBuilder);
modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention> ();
// Add any configuration or mapping stuff here
}
public void Seed (MyDbContext Context)
{
#if DEBUG
// Create my debug (testing) objects here
var TestMyClass = new MyClass () { ... };
Context.MyClasses.Add (TestMyClass);
#endif
// Normal seeding goes here
Context.SaveChanges ();
}
public class DropCreateIfChangeInitializer : DropCreateDatabaseIfModelChanges<MyDbContext>
{
protected override void Seed (MyDbContext context)
{
context.Seed (context);
base.Seed (context);
}
}
public class CreateInitializer : CreateDatabaseIfNotExists<MyDbContext>
{
protected override void Seed (MyDbContext context)
{
context.Seed (context);
base.Seed (context);
}
}
static MyDbContext ()
{
#if DEBUG
Database.SetInitializer<MyDbContext> (new DropCreateIfChangeInitializer ());
#else
Database.SetInitializer<MyDbContext> (new CreateInitializer ());
#endif
}
}
我已经使用过这个模式几次了,它对我来说效果很好。
发布于 2012-02-12 01:15:59
即使在Application_Start
中正确调用了Database.SetInitializer
,我的Seed
方法也没有被调用...原因非常简单:如果您还没有任何实际使用数据库上下文的代码,则可能根本不会调用初始化程序。
发布于 2012-11-22 08:35:23
这是我的伤感小故事。
首先,总结经验教训:
所以,为了避免悲伤:
现在,悲哀的是:
https://stackoverflow.com/questions/6312336
复制相似问题