当从EF中的模型生成数据库时,是否有其他方法来维护计算列



我的工作流程一直是使用EF设计器逐步开发模型,并随着进度从该模型生成数据库。

最近我想要一个计算列,所以我创建了一个字符串属性,将StoreGeneratedPattern设置为computed,并手动将生成的DDL更改为计算列。这通过了测试。

然而,如果稍后从模型中重新生成数据库,我将不得不重新手动更改计算列,这并不值得付出太多努力。

浏览了一下谷歌后,我找不到解决方案,但还是设法使用了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

使用DDL触发器来处理这种情况确实不是一个好主意。如果您想避免删除对数据库的现有更改,请以真正的增量方式(不删除当前状态)构建数据库。例如,使用Database Generation Power Pack(您必须至少拥有具有数据库功能的VS 2010 Premium),这是可能的。还有其他支持工具允许增量数据库开发,如Huagati EDMX工具或LLBGen Designer,但这些工具通常是商业性的。

另一个更复杂的选项是将数据库自定义项直接添加到EDMX中。若有人来到你们的应用程序,他应该能够从模型中生成数据库并使用它,而不需要任何进一步的步骤。实现这一点有点复杂,但这是可能的。关于更改数据库中的数据类型,请检查这个答案——同样的方法也可以用于将任何其他自定义添加到数据库生成工作流中。

最新更新