Есть ли другой способ поддерживать вычисляемые столбцы при создании базы данных из модели в EF? - PullRequest
1 голос
/ 01 февраля 2012

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

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

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

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

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

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

--
-- 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

1 Ответ

0 голосов
/ 01 февраля 2012

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

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

...