2013-02-08 1 views
1

У меня есть код EF Первый DbContext, пользовательский инициализатор, который семени данных и статический класс bootstrap, который устанавливает инициализатор в части Application_Start для Global.asax.Код 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, и я могу войти в этот SQL Server с SSMS и создавать, падение, обновление и т.д. базы данных в порядке.

Если я запускаю приложение с существующей, но пустой базой данных, приложение пытается запустить первый запрос, который он может (в данном случае, некоторые запросы на верификацию пользователя), и сбой при исключении «Недопустимый объект» при попытке запроса таблиц, которые не существуют.

Если я запустил uow.Context.Database.Create() без существующей базы данных, база данных действительно создана, но исходные данные не вставлены.

Если я изменил инициализатор на DropCreateDatabaseAlways, инициализация не произойдет.

Точки останова ударяются по всем указанным выше строкам кода, поэтому немедленное пропускание не пропускается - единственная точка останова, которая не ударяется, является методом семени в инициализаторе, так что даже не вызывается (что не является " t удивительно, если инициализация не происходит!).

На данный момент у меня нет идей - все настроено так, как кажется, должно быть, но инициализации базы данных не происходит.

ответ

0

Moo,

Даже если вызов InitialiseDataAccessLayer() выглядит правильно с тем, что выглядит как правильный призыв к Database.SetInitializer(new DropCreateDatabaseWithSeedData()); попробовать прямой вызов Database.SetInitializer(new DropCreateDatabaseWithSeedData()); из ApplicationStart.

Это не будет создавать ваши UnitOfWork, но я не уверен, что вам нужно это сделать в это время, так как вы посеяны.

Если ничего другого, его другая идея.