2013-11-01 3 views
0

В курсе Джули Лерманс по Entity Framework на Предприятии она создает базовый класс контекста, который выглядит следующим образом.EF/Database Initializor/Порядок выполнения

Public class BaseContext<Tcontext> : DBContext where Tcontext :DBContext 
{ 
static BaseContext() 
{ 
    Database.SetInitializer<TContext>(null); 
} 
Protected BaseContext() 
:base("connectionStringName") 
{} 
} 

, который используется, как это:

public class xxxContext : BaseContext<xxxContext> 
{ 
public Field A { get;set;} 
} 

Затем она продолжает говорить, для инициализации базы данных в ее хранилище будет выглядеть следующим образом

Database.SetInitializer(new MigrateDatabaseToLatestVersion<XXXXContext>()) 
using (var context = new xxxContext()) 
(
    Assert.AreEqual(0, context.Customers.Count())); 
) 

Мой вопрос: В в последнем разделе кода (в этом примере) сначала выполняется Database.SetInitializer, устанавливая MigrateDatabaseToLatestVersion - инициализатор. Однако при создании контекста статический конструктор базового класса выполнял бы (Database.SetInitializer (null)) до того, как будет создан контекст. К моменту, когда код достигнет context.Customers.Count() - инициализатор будет NULL, и инициализатор по умолчанию затем выполнит (CreateIfDatabaseNotExists).

Я не прав? Как сохранить MigrateDatabaseToLatestVersion? Или это?

ответ

0

Чтобы ответить на ваш вопрос, когда вы звоните Database.SetInitializer<TContext>(<ANY_DatabaseInitializer>);, Стратегия инициализации контекста зарегистрирована или обновлена.

Так что да, если вы получаете доступ к TContext после установки NullDatabaseInitializer` в статическом конструкторе. Это приведет к тому, что последний код перехода останется без выполнения, и будет исключение для несоответствия.

Moover, Посмотрите на эту ссылку Entity Framework Code First Web.config Initialization

Трансформаторы Право, хорошо, если вы собираетесь использовать web.config инициализации Entity Framework, то вы определенно хотите использовать Web.config преобразования. Они просто так хорошо сочетаются. Предположим, у вас есть определенная стратегия инициализации для вашей локальной среды dev - DropCreateDatabaseWhenModelChanges, так что вы можете просто сдуть свою базу данных каждый раз, когда она изменяется, после чего она будет загружена с минимальными данными. Это то, чем я занимаюсь. И, очевидно, вам нужно то же самое в производстве. Просто шучу. Это была шутка. Вы хотите MigrateDatabaseToLatestVersion, или, возможно, хотите полностью отключить инициализацию. Итак, как вы управляете изменениями в web.config. Вручную?

+0

codputer, хорошо четко ответить и даже спросить. Джулия может писать статью в контексте (проблемной области/области), которая вам не понятна. Случается! Связываясь с этой статьей и задавая вопрос о том, чтобы вызвать путаницу или понять больше, будет обнадеживающим для всех. «Зная больше» - это Любопытство каждого. Happy Coding ... – jd4u

+0

Я полностью согласен - однако курс в видео на Pluralsight, поэтому я думал, что это лучший способ задать вопрос. Затем я написал в твиттере ее, и она ответила (см. Ниже). У Джулии мое уважение, но мы все можем ошибаться. Я считаю, что это один, мне просто нужно было убедиться, что, насколько я знаю, она так хорошо понимает EF! – codeputer

0

Я думаю, вы неправильно поняли. Я использую DropCreateDatabaseAlways в своих тестах интеграции. Не в репозитории! :) Julie

+0

Я понимаю, что DropCreateDatabaseAlways, вероятно, не является хорошим кандидатом для производственной системы :), поэтому я не могу отметить это как ответ. Я ищу порядок операций. Насколько я могу судить, этот код никогда не выполнит нужный инициализатор базы данных. – codeputer

+0

справедливо - я думал о другом образце. Но я считаю, что вы ошибаетесь (и искажаете) мое руководство. Мой МО. заключается в отключении инициализации в базовом классе, который используется ограниченными классами dbcontext. В ходе курса у меня также был проект, который отвечает за выполнение инициализации db. Контекст знает все сущности и их отношения, в то время как меньшие контексты знают только подмножество. Контекст в этом проекте не наследуется от базового класса. Поэтому никакого конфликта и, следовательно, не стоит сомневаться в том, что кто-то переопределяет другого. –

+0

Ваше право! Я пропустил это в контексте создания базы данных, вы НЕ наследовали от Basecontext, а из DBContext!Я думаю, что это простая миссия, и я бы рекомендовал выделить ее в вашем видео, чтобы тестовый метод НЕ использовал Basecontext. Кроме того, с EF6, возможно, дополнительная рекомендация заключалась бы в том, чтобы вставить его в конфигурацию? У меня было два сотрудника, которые рассматривали это, и мы все были в замешательстве! – codeputer

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

  • Нет связанных вопросов^_^