使用ORM NHibernate时,有哪些标准或最佳开源方法可以将模式更改传播给拥有该软件现有版本的应用程序用户?
如果我需要在现有类中添加或删除属性,如何为使用以前版本软件的用户正确处理这些更改?
如果可能的话,我正在寻找能在Mono上运行的东西。
我不希望每次创建应用程序的新版本时都不必分析ORM更改生成的模式,并手动编写版本更新。
(我假设我将使用NHibernate为数据库创建模式,但如果有不同的方法可以消除这个问题,那么我愿意接受答案)。
答案 0 :(得分:1)
就像您对源代码使用版本控制一样,您应该对数据库模式使用版本控制,尤其是当您打算为应用程序提供更新功能时。有一些工具可以帮助您,但我更喜欢使用带有SQL命令的XML文件手动更新架构修订或降级,如下所示:
<Revision Id="3">
<Up>
<SqlCommand>CREATE TABLE [Category] ( [Id] BigInt Primary Key, [Name] nvarchar(255) )</SqlCommand>
<SqlCommand>ALTER TABLE [Group] ADD CanRead bigint NULL</SqlCommand>
<SqlCommand>UPDATE [SysValue] SET [Value] = '3' WHERE [Name] = 'Revision'</SqlCommand>
</Up>
<Down>
<SqlCommand>DELETE TABLE [Category]</SqlCommand>
<SqlCommand>ALTER TABLE [Group] DROP COLUMN [CanRead]</SqlCommand>
<SqlCommand>UPDATE [SysValue] SET [Value] = '2' WHERE [Name] = 'Revision'</SqlCommand>
</Down>
</Revision>
好的一点是,如果你正确地编写SQL命令就可以在不丢失数据的情况下更改模式,你可以编写复杂的查询来将数据复制到临时表,然后大大改变这个表并复制数据,转换数据等。