6

我正在尝试实施此解决方案: NHibernate-20-SQLite-and-In-Memory-Databases

唯一的问题是我们有这样的 hbms:

<class name="aTable" table="[dbo].[aTable]" mutable="true" lazy="false">

with[dbo]在表名中,因为我们使用的是 mssql,而这不适用于 Sqlite。

我在 rhino-tools-dev 小组上发现了这篇帖子,他们谈论只是从映射中删除模式,但在 NH2 上似乎没有classMapping.Schema.

有一个classMapping.Table.Schema,但它似乎是只读的。例如,这不起作用:

 foreach (PersistentClass cp in configuration.ClassMappings)            {
  // Does not work - throws a 
  //System.IndexOutOfRangeException: Index was outside the bounds of the array.
        cp.Table.Schema = "";
    }
  • 有没有办法告诉 Sqlite 忽略[dbo](我试过了attach database :memory: as dbo,但这似乎没有帮助)?
  • 或者,我可以以编程方式将其从类映射中删除(不幸的是,现在无法更改 hbms)?
4

3 回答 3

9

我们在使用 SQLite 时遇到了太多问题,最终促使我们切换到 SQL Express。我记得的问题:

  1. SQLite,在内存中使用时,会在 Session 关闭时丢弃数据库
  2. SQLite 不支持诸如 ISNULL 之类的基本 SQL 构造,但也支持更高级的 SQL 构造,例如公共表表达式和 SQL 2005 和 2008 中添加的其他构造。当您开始编写复杂的命名查询时,这一点变得很重要。
  3. SQLite 的日期时间比 SQL Server 的可能值范围更大
  4. 在事务范围内使用时,用于 SQLite 的 API NHibernate 的行为与用于 MS SQL Server 的 ADO.NET 不同。一个例子是 hbm-to-ddl 工具,它的 Execute 方法在 SQL Server 的事务中不起作用,但在 SQLite 中可以正常工作。

总而言之,基于 SQLite 的单元测试远不能最终代表您在 PROD 中使用 MS SQL Server 时遇到的问题,因此会破坏整体单元测试的可信度。

于 2009-04-30T00:41:39.507 回答
1

我们正在使用 Sqlite 运行 NH 2.0.1 的单元测试。其实我没有遇到这个问题。我只是没有指定 dbo,我认为它是 SqlServer 上的默认值。

顺便说一句,配置文件中有一个default_schema参数。这实际上是数据库名称,但您可以尝试将 dbo 放在那里,当然仅用于 SqlServer 配置。

于 2009-04-30T00:12:13.070 回答
0

在查看了 NH 的来源并进行了一些实验后,我想我找到了一个简单的解决方法 -

    foreach (PersistentClass cp in configuration.ClassMappings)
    {
        // Input : [dbo].[Tablename] Output : Tablename
        cp.Table.Name = Regex.Replace(cp.Table.Name, @"^\[.*\]\.\[", "");
        cp.Table.Name = Regex.Replace(cp.Table.Name, @"\]$", "");
        // just to be sure
        cp.Table.Schema = null;                
    }

请注意,当空字符串引发异常时,我可以将 Table.Schema 设置为 null ...

感谢您的回答!

于 2009-04-30T10:36:38.717 回答