2012-01-31 1 views
1

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

Недавно я захотел вычисленный столбец, поэтому я создал свойство string, установил StoreGeneratedPattern = Computed и вручную изменил сгенерированный DDL как вычисленный столбец. Это проходит испытание.

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

После просмотра Google немного, я не смог найти решение, но ему удалось создать триггер DDL.

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

Update: Я решил пойти с триггером DDL раствором ниже, хотя я до сих пор интересно, если это не нужно, но я подозреваю, что моя проблема исходит от того, в меньшинстве с моим стилем рабочего процесса и большинство других дона» t имеют эту проблему, потому что они генерируют модель из базы данных ...

-- 
-- DDL Trigger for CREATE TABLE 
-- 
alter trigger ddltrigCreateTable 
on database 
for create_table 
as 
    -- 
    -- Table DirectTrackInfoes 
    -- 
    if EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')='DirectTrackInfoes' 
    begin 
     -- 
     -- Computed Column BaseUrl 
     -- 
     alter table DirectTrackInfoes 
     drop column BaseUrl 
     alter table DirectTrackInfoes 
     add BaseUrl as ((N'https://'+[ClientDomain])+N'/apifleet/rest') 
     -- 
     -- Initial data 
     -- 
     insert into [DirectTrackInfoes] ([Version], [ClientDomain], [ClientId], [AccessId], [UserName], [Password]) 
     values (N'1_0', N'foo.com', 9999, 1, N'', N'') 
    end 
    -- 
    -- Table HttpMethods 
    -- 
    if EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')='HttpMethods' 
    begin 
     -- 
     -- Initial data 
     -- 
     insert into HttpMethods (MethodName) 
     values (N'GET'), (N'POST'), (N'PUT'), (N'DELETE') 
    end 
    go 
+0

Вам нужно поддерживать в таблице, можете ли вы поддерживать частичный класс в коде? Я думаю, это так, что вы можете его индексировать или что-то еще? –

+0

@Paul, мое обоснование частичного выбора класса заключается в том, что он выдает вычисляемое значение, зависящее от вставки клиентов в использование этого контейнера доступа к данным, и, похоже, уступает гарантии его размещения в определении таблицы –

+0

Извините, у вас нет хорошего Ответ на этот вопрос, что я должен был делать с EF для многих вещей, - это просто написать небольшой плагин для визуальных студий, который использует общие XML-обновления (соглашения об именах и т. д.), и я могу просто запустить это против edmx, чтобы исправить его при необходимости. Не идеально, но, по крайней мере, не требует триггера DB, который вы знаете. Если вам интересно, у меня есть код на [GitHub] (https://github.com/paultyng/EdmxUpdater) раннего образца. –

ответ

0

Использование триггера DDL для обработки этой ситуации действительно не очень хорошая идея. Если вы хотите избежать удаления существующих изменений в базу данных, создайте свою базу данных реальным инкрементным способом (без удаления текущего состояния). Это возможно, например, с Database Generation Power Pack (у вас должен быть как минимум VS 2010 Premium с функциями базы данных). Существуют и другие вспомогательные инструменты, позволяющие инкрементную разработку БД, например Huagati EDMX tools или LLBGen Designer, но эти инструменты обычно являются коммерческими.

Другой более сложный вариант - это добавить настройку базы данных непосредственно в EDMX. Если кто-то приходит к вашему заявлению, он должен иметь возможность генерировать базу данных из модели и использовать ее без каких-либо дальнейших шагов. Достичь этого немного сложно, но это возможно. Проверьте this answer об изменении типа данных в базе данных - такой же подход можно использовать для добавления любой другой настройки в рабочий процесс создания базы данных.