另外,是否可以在客户端没有对我的DatabaseContext的引用的情况下调用初始化程序?
我已经包含了我能想到的所有相关代码。如果还有其他有用的信息,请让我知道。
我尝试过的事情:
1. 删除了连接字符串(因为它默认为sqlexpress,只是名称改变了) 2. 我将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; }
}
全局.asax.cs - 应用程序启动()
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 - 应用程序启动()
protected void Application_Start()
{
Database.SetInitializer(new DatabaseInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}