Entity Framework не создает базу данных - PullRequest
33 голосов
/ 04 июля 2011

Работал с функцией Code First Entity Framework 4.1, используя проект ASP.NET MVC 3.

Однако база данных (SQL Server 2008 R2) не создает автоматически сопоставление таблиц при запуске приложения. Любые идеи о том, как это сделать?

В проекте есть только один POCO:

namespace RIS.Models
{
    public class Person
    {
        [Key]
        public virtual string NRIC { get; protected set; }
        public virtual string FirstName { get; protected set; }
        public virtual string MiddleName { get; protected set; }
        public virtual string LastName { get; protected set; }
    }
}

Он также имеет следующий класс контекста базы данных:

namespace RIS.Models
{
    public class RIS_DB : DbContext
    {
        public DbSet<Person> People { get; set; }
    }
}

Я добавил строку подключения SQL в глобальный файл web.config следующим образом:

<add name="RIS_DB" connectionString="Data Source=URAHARA-PC;Initial Catalog=RIS_DB;
Integrated Security=SSPI;Pooling=False" providerName="System.Data.SqlClient"/>

Существует также явная инструкция для создания базы данных, если она не существует в файле Global.asax.cs:

protected void Application_Start()
{
    Database.SetInitializer(new CreateDatabaseIfNotExists<RIS_DB>());

    AreaRegistration.RegisterAllAreas();

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

Ответы [ 3 ]

67 голосов
/ 06 июля 2011

Вместо этого спросили на форумах MSDN и получили удовлетворительный ответ:

Entity Framework не будет создавать базу данных до первого доступа.Текущий блок кода в Application_Start() указывает только стратегию, используемую при создании базы данных при первом доступе.

Чтобы инициировать создание базы данных при запуске, необходимо создать экземпляр контекста базы данных и context.Database.Initialize(true) должен быть вызван.

3 голосов
/ 08 октября 2014

У меня та же проблема и я нашел элегантное решение: вызовите SetInitializer в конструкторе вашего DbContext:

public class MyDbContext : DbContext
{
   protected MyDbContext : this("MyConnection")
   {
       Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
   }
}

Настройки моего приложения:

<connectionStrings>
    <add
      name="MyConnection"
      connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\MyDB.mdf;Initial Catalog=MyDB;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
1 голос
/ 21 апреля 2017

Я знаю, что Мацацуши уже правильно ответил на это.Но просто чтобы прояснить это новичкам: основываясь на ответе Мацацуши, вам нужно написать:

        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SorteoContext>());
        using (var context = new SorteoContext())
        {
            context.Database.Initialize(force: true);
        }

внутри функции Application_Start () в Global.asax.cs и Boom!работает!

...