Как средство миграции EF Code-First определяет, какие изменения были внесены в модель?

Я изучаю миграции, и мне любопытно, как инструмент миграции определяет, какие изменения в нашей модели были внесены после создания последней миграции.

Например, предположим, что мы создали миграцию M1 и применили ее, введя команду Update-Database. После применения M1, если мы добавим новое свойство P в класс C и создадим другую миграцию M2, введя команду Add-Migration M2, то инструмент миграции каким-то образом сможет выяснить, что это только изменение (после M1 был создан), мы добавили в модель новое свойство P в класс C. Как инструмент миграции это определяет?

Спасибо

ОТВЕТ:

Миграции используют таблицу __Migrations, чтобы определить, какие миграции уже были применены, а какие еще предстоит применить, но я думал, что она не использует эту таблицу, чтобы также выяснить, что изменилось от одной миграции к другой, поскольку данные в таблице миграции представляют собой хэш, что означает, что их нельзя расшифровать, что, как я полагаю, необходимо для сравнения метаданных текущей модели с последними метаданными, хранящимися в таблице миграции?!

Или вы подразумеваете, что он может определить, просто сравнивая хеш-значения (текущей и сохраненной версий), какие свойства были изменены, удалены или добавлены к объекту?


person carewithl    schedule 27.11.2012    source источник


Ответы (2)


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

person Pawel    schedule 28.11.2012
comment
@carewithl: значение, хранящееся в столбце «Модель», не является хэшем, это двоичное представление ZIP-файла с кодировкой base-64, содержащего файл EDMX, описывающий модель, см. tecsupra.com/ - person janv8000; 17.12.2014

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

person Ivan Doroshenko    schedule 10.11.2014