2015-10-12 4 views
4

Я начинаю работать с сущностью. Проблема в том, что мой метод OnModelCreating никогда не вызывается.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()) 
     { 

     } 

Где сделать ошибку?

+0

Возможный дубликат [EF 4.1 Code First - OnModelСоздание времени вызова] (http://stackoverflow.com/questions/5634338/ef-4-1-code-first-onmodelcreating-call-time) – Marusyk

ответ

2

Try, чтобы добавить новый объект в контекст и сохранение изменений.

Как

using (var context = new TestContext()) 
{ 
    context.WorkItem.Add(new WorkItem()); //Construct valid entity 
    context.SaveChanges(); 
} 

По стратегии по умолчанию, он будет пытаться создать базу данных, если она не существует. Или, по крайней мере, выбросит исключение.

Или вы можете заставить его создать базу данных при запуске

context.Database.Initialize(true);

https://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.113).aspx

+0

Я получаю исключение: исключение типа 'System.Data.SqlClient.SqlException' произошел в EntityFramework.SqlServer.dll, но не был обработан в коде пользователя Дополнительная информация: при установлении соединения с SQL Server возникла связанная с сетью или конкретная ошибка экземпляра. Сервер не найден или недоступен. Убедитесь, что имя экземпляра правильно и что SQL Server настроен на разрешение удаленных подключений. (поставщик: сетевые интерфейсы SQL, ошибка: 50 - Произошла ошибка локальной базы данных. Указанное имя экземпляра LocalDB недопустимо. – Raskolnikov

+0

Источник данных = (LocalDB) \ v11. 0 похоже неверно. Какую версию MSSQL вы используете? –

+0

Я нашел решение. В последнем изменении я имел (LocalDB) \\ v11.0 ('\' два раза). благодаря – Raskolnikov

4

Этот метод вызывается, когда модель для производного контекста была инициализирована, но до того, как модель была заблокирована и использована для инициализации контекса.

Как правило, этот метод вызывается только один раз, когда создается первый экземпляр производного контекста. Модель для этого контекста затем кэшируется и предназначена для всех дополнительных экземпляров контекста в домене приложения. Это кэширование можно отключить, установив свойство ModelCaching на данный ModelBuidler, но обратите внимание, что это может серьезно ухудшить производительность.
MSDN

Если база данных не существует, она использует информацию из скомпилированной модели для ее создания. Модель создается только один раз для каждого приложения. OnModelCreating никогда не будет вызываться при использовании подхода Database First. Он никогда не будет вызван, потому что все сопоставления уже существуют в EDMX, поэтому Code First и DbModelBuilder никогда не используются.

Попытки вызвать к статической инициализации перед выполнением вызова SetInitializer:

using (var context = new TestContext()) 
{ 
    Database.SetInitializer(new CreateDatabaseIfNotExists<EntityContext>()); 
    context.Database.Initialize(true); 
} 
+0

Как называть это еще раз. Мой db не создан? – Raskolnikov

+0

@ Раскольников Я обновил ответ. Попытайтесь следовать этому – Marusyk

+0

Я получаю исключение: исключение типа «System.Data.SqlClient.SqlException» произошло в EntityFramework.SqlServer.dll, но не обрабатывалось в коде пользователя Дополнительная информация: связанная с сетью или конкретная ошибка экземпляра произошел при установлении соединения с SQL Server. Сервер не найден или не был доступен. Проверьте правильность имени экземпляра и настройте SQL Server для удаленного подключения.(поставщик: сетевые интерфейсы SQL, ошибка: 50 - возникла ошибка Runtime локальной базы данных. Указанное имя экземпляра LocalDB недопустимо. – Raskolnikov

0

В моем случае это происходит потому, что я оставил {получить; задавать; } из моего объявления DBSet. Понадобилось время, чтобы понять это!

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