2015-08-07 2 views
2

Я, по общему признанию, немного сумасшедший по этому вопросу, поэтому несите меня. Я пытаюсь сделать это в течение примерно 5 часов, и сейчас я просто ударяю головой о стену. Вот что у меня есть:Не удается получить приложение Entity Framework MVC для посева данных в базу данных

Global.asax.cs

namespace MyApp 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      Database.SetInitializer(new MyInitializer()); 
     } 
    } 
} 

MyInitializer.cs

namespace MyApp.App_Start 
{ 
    public class MyInitializer : DropCreateDatabaseIfModelChanges<MyContext> 
    { 
     protected override void Seed(MyContext context) 
     { 
      // seed data goes here 
      sample_data = new List<MyModel> 
      { 
       new MyModel{"foo"}, 
       new MyModel{"bar"} 
      }; 

      sample_data.ForEach(s => context.MyModels.Add(s)); 
      context.SaveChanges(); 
     } 
    } 
} 

MyContext.cs

namespace MyApp.Models 
{ 
    public class MyContext : DbContext 
    { 
     public MyContext() : base("MyContext") 
     { 
      Database.SetInitializer<MyContext>(new MyInitializer()); 
     } 

     public DbSet<MyModel> MyModels { get; set; } 
    } 
} 

Web.config

<connectionStrings> 
    <add name="MyContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=MyContext; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|MyContext.mdf" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

<entityFramework> 
    <contexts> 
     <context type="MyApp.Models.MyContext, MyApp"> 
      <databaseInitializer type="MyApp.App_Start.MyInitializer, MyApp" /> 
     </context> 
    </contexts> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
</entityFramework> 

Я просто не могу понять, почему он не посеял какие-либо данные. Я прочитал дюжину или более подобных случаев здесь и в других местах, пробовал почти каждую итерацию и все равно не могу заставить ее запускаться вообще. Он никогда не ударяет по функции Seed(). База данных существует, и если я удалю ее, она будет восстановлена, но никогда не будет заполнена.

Я склоняюсь к тому, что проблема связана с моим web.config, но я еще не понял этого. Какие-либо предложения?

+0

Вы используете миграцию? См. Здесь: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-entity-framework-in-an -asp-net-mvc-application – Eraph

+0

Вы добавили код семени в нужный класс? Ваш код говорит «new MyInitializer()», но имя класса, который вы показываете, - PropertyInitializer – Sam

+0

@Sam Исправлено это. Просто ошибка в расшифровке. – dash

ответ

0

Я решил это. По-видимому, вопрос был двояким.

  1. The «DropCreateDatabaseIfModelChanges» в инициализаторе не стрелял, так как он не видел, что модель изменилась. Изменение этого параметра на «DropCreateDatabaseAlways» работало, но обычно приводило к появлению сообщения об ошибке «Невозможно удалить базу данных, поскольку оно в настоящее время используется». Ручное отключение баз данных и перезапуск VS обычно разрешали это, хотя мне все же приходилось запускать его 2-3 раза. Как только он упал и восстановил базу данных, возврат к «DropCreateDatabaseIfModelChanges» выполняется быстрее и по-прежнему работает.

  2. Я, возможно, не хватало линии в моей Web.config

    <appSettings> 
        <add key="MyInitializer MyApp.Models.MyContext, MyApp.Models" value="MyApp.App_Start.MyInitializer, MyApp.Models" /> 
    </appSettings> 
    

Между этими двумя вещами [ну еще как 4 вещей], кажется, работает в настоящее время.

1

Согласно this blog, DbInitializer не вызывается до тех пор, пока вы фактически не попытаетесь получить доступ к базе данных.

// Code copied from linked blog 
static void Main(string[] args) 
{ 
    Database.SetInitializer(new DropCreateDatabaseAlways<BlogContext>()); 
    using (var db = new BlogContext()) //initializer won't be called here 
    { 
     ... 
     db.Categories.Add(cat); //initializer will be called here 
     db.BlogPosts.Add(post); 
     ... 
    } 
    Console.ReadLine(); 
} 
+0

У меня возникли проблемы с расшифровкой между приложениями MVC и приложениями, отличными от MVC. Как я не хочу индивидуально добавлять каждый элемент в файл Global.asax.cs, как это мне помогает? Я думал, что смысл переопределения семян был таким, что вам не нужно было это делать? – dash

+0

Ограничение семян заключается в том, что, когда база данных сначала получает доступ к dbContext, она может иметь специальную обработку. В вашем примере кода вы никогда не делали ничего, что требовало двусторонней поездки в БД. – Eris

Смежные вопросы