我正在研究在桌面应用程序中使用Fluent NHibernate,该应用程序使用3个不同的数据库文件。 (好吧,3种不同的类型。)
创建这个并不是一个真正的问题,因为SchemaExport.Create函数可以完美地完成这个任务。
我面临的问题是我并不确切知道改变我的桌子的最佳方法是什么。更确切地说,一次进行多个版本更新。我的应用程序目前是版本1,随附数据库格式版本1,下周我将所有版本都升级到版本2 - 我可以使用SchemaUpdate.Execute更新数据库 - 下个月我将所有内容都添加到版本3并且我可以再次执行相同的操作。但我希望我的用户能够立即从版本1更新到版本3.
如果我会手动执行操作,我会在每个包含版本的数据库文件中创建一个名为version的表。然后我会针对当前版本检查该字段并执行ALTER表查询。例如:
if (db_version < LATEST_VERSION) {
switch (db_version + 1) {
case 2: Execute("ALTER TABLE A..."); Execute("UPDATE A..."); break;
case 3: Execute("ALTER TABLE B..."); break;
}
}
使用这种方法(当直接使用SQLite数据库提供程序时)我只需要预见我的数据模型的1个版本,1个更新服务处理所有内容,但我需要手动创建我的数据库和我的数据模型文件,以及我将不得不更新至少两个.db文件和2个更新服务(每个数据库类型一个)。这可以看作是重复的工作。 (我发现database migration of Banshee是我的意思的一个例子。)
通过使用NHibernate我消除了维护数据库文件和数据模型的过程,但是从1到3进行更新的唯一方法是保留每个数据模型的旧版本,并执行以下操作: / p>
namespace Version1 {
public class A {}
DoUpdate();
}
namespace Version2 {
public class A {}
DoUpdate();
}
我是否完全以错误的方式看待这种情况,或者我的情况只是复杂而且我会更好地使用手动方法吗? 使用Fluent NHibernate更新和从版本1迁移到3的最佳解决方案是什么?或者有人会建议使用手动方法,如果是这样,为什么?
答案 0 :(得分:2)
我无法用流利的NHibernate回答如何做到这一点,因为我从来没有想过一个好方法。在我看来,它没有设置来处理真正的数据库迁移。因此,对于我所有的Fluent NHibernate项目,我正在使用http://code.google.com/p/migratordotnet/这不是完美的,但它可以完成工作。