2015-11-18 1 views
3

У меня есть база данных First EDMX, и у одного из Entities есть свойство, которое должно быть установлено как StoreGeneratedPattern = Identity, чтобы использовать последовательные GUID в качестве первичного ключа.Как сохранить настройки StoreGeneratedPattern при обновлении базы данных DB First EDMX?

Это работает правильно, однако в любой момент, когда модель обновляется с помощью «Обновить модель из базы данных», значение сбрасывается до StoreGeneratedPattern = None и должно быть отредактировано вручную.

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

Я собрал там нет простого способа сохранить значение StoreGeneratedPattern, но есть не просто путь? Может быть, даже автоматический скрипт, который запускается всякий раз, когда EDMX обновляется и редактирует EDMX? Любое решение, которое не связано с необходимостью знать все, что нужно отредактировать?

Спасибо

+0

Вы устанавливаете это в дизайнере или в XML? Просто угадывая здесь, но в моем проекте этот параметр никогда не перезагружается после «Обновить модель из базы данных». – InvisiblePanda

+0

@InvisiblePanda Я изменил его в дизайнере .. в ваших проектах это поле GUID? –

+0

Ах, из приведенного ниже ответа я предполагаю, что разница в том, что я не использую SQL Server на данный момент, но Oracle, и с последовательностями он работает без перезагрузки. Ну тогда удачи :) – InvisiblePanda

ответ

2

Это потому, что его не неявно можно установить столбец GUID в качестве идентичности автоматического Инкрементирования в SQL Server. Я знаю, что вы можете взломать место, например, установив значение по умолчанию для этого «так называемого» столбца идентификации newsequentialid(), чтобы автоматически заполнить этот столбец с помощью GUID, но технически этот столбец не является столбцом идентификации для этой таблицы как таковой. Очевидно, что когда EF генерирует EDMX во время «Обновить модель из БД», он обрабатывает этот столбец как обычный столбец, а не как автоматически увеличивающийся идентификатор, поэтому перезаписывает отредактированное вручную StoreGeneratedPattern = Identity обратно в StoreGeneratedPattern = None.

Это хак, и я настоятельно рекомендую не вносить какие-либо изменения в автогенерированный код EF. Я видел, как многие разработчики сжигались, когда они делали это для немедленного лечения, но когда он возвращается и кусает их позже, они хотят, чтобы они никогда не манипулировали автоматически сгенерированным кодом.

Просто предостережение!

0

Все мои основные ключи - это гиды с ограничением DEFAULT (newsequentialid()). Игнорирование @ очень хороший совет Маниш, я использовать следующие два поиска и замены регулярных выражений в Notepad ++, чтобы обновить файл .edmx после обновления из БД:

Найти # 1:(<Key>\s*<PropertyRef Name="([^"]+)" />\s*</Key>\s*<Property Name="\2" Type="uniqueidentifier")(Nullable="false" />)

Заменить # 1 :\1StoreGeneratedPattern="Identity" \3

поиск # 2:(<Key>\s*<PropertyRef Name="([^"]+)" />\s*</Key>\s*<Property Name="\2" Type="Guid" Nullable="false")(/>)

Заменить № 2:\1annotation:StoreGeneratedPattern="Identity" \3

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

YMMV. Используйте на свой страх и риск.

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