数据库已成功创建(表也是如此),但未设定种子。我花了几个小时并阅读了大量文章,但一直没能得到它。有什么建议吗?
顺便说一句,是否可以在客户端中不引用我的 DatabaseContext 的情况下调用初始化程序?
我已经包含了我能想到的所有相关代码。如果还有什么有帮助的,请告诉我。
我尝试过的事情:
- 我删除了连接字符串(因为它默认为 sqlexpress,只是更改了名称)
- 我将 DropCreateDatabaseIfModelChanges 更改为 DropCreateDatabaseAlways,还是一样。
编辑:真正奇怪的是它曾经工作过一次,但我不知道它是如何或为何再次损坏的。我假设连接字符串,但谁知道呢。
数据库初始化器.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 放在不同的类中。我不太明白这些微小的变化是否解决了这个问题,但它就是这样。
数据库初始化器.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);
}
最佳答案
这就是我的 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
}
}
我已经使用过这种模式几次,它对我来说非常有效。
关于entity-framework - 如何使用 Entity Framework Code First 为我的数据库提供种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6312336/