Entity Framework не создает базу данных
Играя с функцией 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);
}
Ответы
Ответ 1
Отвечая на вопрос на форумах MSDN, и получил удовлетворительный ответ:
Entity Framework не будет создавать базу данных до первого доступа. Текущий код в Application_Start()
определяет только стратегию, используемую при создании базы данных во время первого доступа.
Чтобы инициировать создание базы данных при запуске, необходимо создать экземпляр контекста базы данных и вызвать context.Database.Initialize(true)
.
Ответ 2
У меня такая же проблема, и я нашел элегантное решение: вызовите 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>
Ответ 3
Я знаю, что на это уже ответили мацацуши самым правильным образом.
Но просто для того, чтобы прояснить это для начинающих:
Основываясь на мазацуси, ответьте, что вам нужно сделать, это написать:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SorteoContext>());
using (var context = new SorteoContext())
{
context.Database.Initialize(force: true);
}
внутри функции Application_Start() в Global.asax.cs
и Бум! работает!