2013-02-08 93 views
1

我有一个EF代码第一次的DbContext,自定义初始化它的种子数据,并且将在Global.asax中的一部分的Application_Start初始化自举静态类。EF代码第一次不进行初始化数据库

的初始化是这样的:

public class DropCreateDatabaseWithSeedData : DropCreateDatabaseAlways<MyEntities> 
{ 
    protected override void Seed(MyEntities context) 
    { 
     context.Genders.Add(new Gender { Id = 1, Name = "Male", SortOrder = 1 }); 
     context.Genders.Add(new Gender { Id = 2, Name = "Female", SortOrder = 2 }); 
     context.Genders.Add(new Gender { Id = 3, Name = "Prefer not to say", SortOrder = 3 }); 
    } 
} 

自举静态类的样子:

public static class Bootstrap 
{ 
    public static void InitialiseDataAccessLayer() 
    { 
     Database.SetInitializer(new DropCreateDatabaseWithSeedData()); 
     var uow = new UnitOfWork(); 
     uow.Context.Database.Initialize(force: true); 
    } 
} 

在Global.asax的Application_Start样子:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 

     DataAccess.Infrastructure.Bootstrap.InitialiseDataAccessLayer(); 
    } 

一切看起来,因为它应该,但是没有数据库初始化发生 - 如果我运行没有预先存在的数据库的应用程序在所有的,我得到一个异常的SqlClient:

A System.Data.SqlClient.SqlException was thrown: "Cannot open database MyEntities requested by the login. The login failed. Login failed for user 'localdev'." 

用户localdev具有完全访问SQL Server的,我可以登录到与SSMS的SQL Server和创建,删除,更新等数据库的罚款。

如果我运行一个现有的,但空数据库的应用程序,应用程序试图运行它可以在第一个查询(在这种情况下,一些用户验证查询)失败的“无效的对象”的例外,因为它试图查询不存在的表格。

如果我运行uow.Context.Database.Create(),没有现有的数据库,的确是创建数据库,但没有种子数据插入。

如果我改变初始化到DropCreateDatabaseAlways,不动初始化发生。

所有上述代码行都会触发断点,因此不会立即跳过 - 唯一没有命中的断点是初始化器中的种子方法,因此甚至不会被调用(这不是被称为“如果初始化没有发生,那么就会令人惊讶!)。

在这一点上,我的想法 - 一切都建立了,因为它看起来像它应该的,但没有数据库初始化正在发生的事情。

回答

0

哞,

即使调用InitialiseDataAccessLayer()看起来有什么看起来像一个正确调用Database.SetInitializer(new DropCreateDatabaseWithSeedData());正确尝试从ApplicationStartDatabase.SetInitializer(new DropCreateDatabaseWithSeedData());直接调用。

它不会实例化UnitOfWork,但我不知道,你需要做的,在这个时候,因为你是播种。

如果不出意外,它的另一个想法。