在EF中从模型生成数据库时,是否有另一种维护计算列的方法?

时间:2012-01-31 21:50:24

标签: c# entity-framework calculated-columns

我的工作流程是使用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 :(得分:0)

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

另一个更复杂的选项是将数据库自定义直接添加到EDMX。如果有人来到您的应用程序,他应该能够从模型生成数据库并使用它而无需任何进一步的步骤。实现这一点有点复杂但有可能。检查this answer有关更改数据库中数据类型的方法 - 可以使用相同的方法将任何其他自定义添加到数据库生成工作流程中。