【发布时间】:2010-12-12 21:41:18
【问题描述】:
我正在研究在使用 3 个不同数据库文件的桌面应用程序中使用 Fluent NHibernate。 (嗯,3 种不同的类型。)
- DB1 是包含表 A、B、C 和 D 的主数据库文件。
- DB2 是一个数据库文件,包含表 E 中的详细数据(每秒 X 个样本,程序会话将收到一个新文件,因为它们可能会变得非常大)。
- DB3 是一个数据库文件,用于在用户之间导出和导入数据(包含 A 的 1 行,B 的 1 行以及属于 A 和 B 给定行的所有 E)
创建它并不是一个真正的问题,因为 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 进行更新的唯一方法是保留每个数据模型的旧版本并执行以下操作:
namespace Version1 {
public class A {}
DoUpdate();
}
namespace Version2 {
public class A {}
DoUpdate();
}
我是完全看错了,还是我的情况太复杂了,使用手动方法会更好吗? 使用 Fluent NHibernate 从版本 1 更新和迁移到 3 的最佳解决方案是什么?或者有人会推荐使用手动方法吗?如果是,为什么?
【问题讨论】:
-
您是对的,通常使用“迁移”方法来构建数据库,您需要在每个步骤中都坚持。
标签: c# database nhibernate