2012-05-31 7 views
0

Я хочу программно создать сценарий создания базы данных для моей базы данных EF 4.3 Code-First. База создает просто отлично, используя стандартные механизмы DatabaseInitializer, но следующий код не:Сценарий EF 4.3 с использованием ObjectContext с ошибкой при создании кода с помощью встроенного DatabaseInitializer

using(var dc = new MyContext()) 
{ 
    var objContext = (IObjectContextAdapter)dc; 
    var script = objContext.ObjectContext.CreateDatabaseScript(); 
} 

исключение я получаю:

магазина генерируется модель «компьютерные» не поддерживаются для свойств, а не типа «timestamp» или «rowversion».

У меня есть вычисляемый столбец, определенный типа «строка», но, как я уже сказал, база данных создается отлично при создании через встроенный DatabaseInitializer. Как ни странно, результирующая схема с использованием этого метода фактически не создает вычисляемый столбец.

Что касается Почему Я делаю это, у меня есть сценарий, который запускает post-create, который удаляет этот столбец и создает столбцовый вычисленный столбец. Без указания столбца, вычисленного в EF-сопоставлении, он попытается присвоить этому столбцу значение для вставок, которое затем завершится неудачей.

ответ

1

Отказ от создания базы данных на мгновение, установка «Вычисление» означает, что EF не будет пытаться записать значение этого столбца, но будет считывать значение, которое (предположительно) было бы сервером при каждом запросе столбца. С точки зрения EF справедливо иметь вычисленный столбец для любого типа данных.

Теперь рассмотрим создание базы данных из модели EF. EF не знает, что делать, чтобы создать вычисляемый столбец в базе данных, и, возможно, даже это невозможно сделать без триггеров в определенных базах данных в зависимости от типа столбца. Таким образом, в EF4 было принято решение сделать бросок CreateDatabaseScript в этих ситуациях.

Однако EF 4.3 и более поздние версии больше не используют CreateDatabaseScript при настройке на SQL Server или SQL Server Compact. Вместо этого они используют конвейер Migrations. Для конвейера Migrations мы решили использовать другой подход, потому что мы чувствовали, что для создания базы данных не всегда нужно выбрасывать то, что может быть вполне допустимой моделью. Особенно учитывая, что вы могли бы написать свой собственный SQL в миграции, который добавил триггер или какой-либо другой механизм, чтобы создать базу данных для создания допустимого вычисленного столбца.

Так вот почему вы видите базу данных, создаваемую EF 4.3 (но ничего не делая, чтобы вычислять столбец), но затем вы видите ту же модель при попытке использовать CreateDatabaseScript, который использует более старые механизмы без миграции ,

Способ исправления заключается в том, чтобы создавать миксы для создания сценариев вместо использования CreateDatabaseScript.

+0

Я не согласен с Миграциями, как вы можете видеть по некоторым из моих последних вопросов. Зависимость от реальной базы данных является проблематичной. По причинам, не зависящим от меня, мне требуется возможность просто получить сценарии DDL, будь то сценарий «diff» от одного перехода к другому или весь сценарий создания в любой заданной точке. –