EF 4.1 Code First - OnModelСоздание времени звонка - PullRequest
8 голосов
/ 12 апреля 2011

Когда я отлаживаю свое приложение, кажется, что этот метод не выполняется в контексте конструктора DbContext.Так когда же тогда это называется?

Ответы [ 3 ]

30 голосов
/ 31 мая 2011

Для ясности, OnModelCreating не имеет никакого отношения к тому, создает ли EF базу данных для вас.

Чтобы взаимодействовать с базой данных, Entity Framework должна создать модель объектов, которая будетбыть настойчивым.Если эта модель еще не построена и не кэширована, это событие вызывается.

После того, как модель построена, из нее генерируется хеш, а затем EF пытается подключиться кбазы данных, чтобы узнать, существует ли (a), (b) она содержит информацию о версии, предыдущий хеш, сохраненный в таблице EdmMetadata, и (c) совпадает ли этот хэш с ранее вычисленным из модели.

Если хэши не совпадают, EF использует установленный инициализатор базы данных (вызывая Database.SetInitializer(new SomeInitializerType()), который может или не может отбрасывать, создавать или иным образом изменять вашу базу данных.Инициализатор по умолчанию, используемый, когда вы не указываете другой, ничего не делает с вашей базой данных, и после его запуска Entity Framework откажется взаимодействовать с базой данных, если она не синхронизирована.

ЕслиВаша база данных не содержит таблицу EdmMetadata с хешем, Entity Framework предполагает, что вы управляете схемой базы данных самостоятельно, и с радостью пытается ее использовать, надеясь, что вы все сделали правильно.Если в будущем схема не будет соответствовать ожиданиям EF, вы получите ошибки при вызове SaveChanges () и т. Д.

Во всех этих сценариях, независимо от того, управляете ли вы своей собственной схемой базы данных илипозволяя EF отбрасывать и воссоздавать его по мере необходимости, независимо от того, синхронизирована ли база данных с вашей моделью или нет, событие OnModelCreating инициирует первый раз, когда Entity Framework должна узнать, что оно сохраняется.

10 голосов
/ 12 апреля 2011

Этот метод вызывается, когда EF должен получить доступ к базе данных в первый раз (так что это не происходит во время создания контекста). Если база данных не существует, она использует информацию из скомпилированной модели для ее создания. Модель создается только один раз для каждого приложения (она кэшируется внутри), поэтому даже если вы располагаете контекстом, ваша модель все равно будет повторно использоваться для следующего экземпляра.

0 голосов
/ 12 апреля 2011

OnModelCreating срабатывает, когда EF4 создает базу данных. Обычно это событие используется для настройки способа генерации базы данных EF4, поэтому, если вы выполнили свое приложение раньше и ваша модель остается прежней, база данных уже существует, и EF4 не пытается создать новую (хотя это поведение также зависит некоторые параметры конфигурации).

...