OnModelCreating никогда не вызывается
Я начинаю работу с Entity framework. Проблема в том, что мой метод OnModelCreating никогда не вызывается.
Это мой класс контекста:
public class TestContext : DbContext
{
public TestContext()
: base("name=TestDBConnectionString")
{ }
public DbSet<WorkItem> WorkItems { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
строку подключения
<add name="TestDBConnectionString"
connectionString="Data Source=(LocalDB)v11.0;Initial Catalog=TestDB;Integrated Security=true"
providerName="System.Data.SqlClient"/>
Я ожидаю, что войду в OnModelCreating, когда позвоню:
using (var context = new TestContext())
{
}
где я ошибся?
3 ответов
попробуйте добавить новую сущность в контекст и сохранить изменения.
Как
using (var context = new TestContext())
{
context.WorkItem.Add(new WorkItem()); //Construct valid entity
context.SaveChanges();
}
по умолчанию он попытается создать базу данных, если она не существует. Или, по крайней мере, выбросит исключение.
или вы можете заставить его создать базу данных при запуске
контексте.База данных.Initialize (true);
https://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs. 113).aspx
этот метод вызывается, когда модель для производного контекста была инициализирована, но до того, как модель была заблокирована и использована для инициализации contex.
как правило, этот метод вызывается только один раз при создании первого экземпляра производного контекста. Модель для этого контекста затем кэшируется и используется для всех последующих экземпляров контекста в домене приложения. Это кэширование можно отключить, установив ModelCaching
свойство на данном ModelBuidler, но обратите внимание, что это может серьезно ухудшить производительность.
См.MSDN
если база данных не существует, она использует информацию из скомпилированной модели для ее создания. Модель создается только один раз для каждого приложения. OnModelCreating никогда не будет вызываться при использовании первого подхода к базе данных. Он никогда не будет вызван, потому что все сопоставления уже существуют в EDMX и поэтому код First и DbModelBuilder никогда не используются.
попробуйте вызвать статический инициализатор перед выполнение вызова SetInitializer:
using (var context = new TestContext())
{
Database.SetInitializer(new CreateDatabaseIfNotExists<EntityContext>());
context.Database.Initialize(true);
}
в моем случае это происходило потому, что я оставил { get; set; } вне моей декларации DBSet. Потребовалось время, чтобы понять это!