使用Sqlite In Memory DB进行单元测试MYSQL-DB

时间:2009-04-29 22:09:41

标签: sql-server unit-testing nhibernate sqlite in-memory

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

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

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

表名中有[dbo],因为我们正在使用mssql,这对Sqlite不起作用。

我在rhino-tools-dev组中找到了this posting,他们在那里讨论了从映射中删除模式,但在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)?

3 个答案:

答案 0 :(得分:7)

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

  1. SQLite,当在内存中使用时,在会话关闭时丢弃数据库
  2. SQLite不支持一堆SQL结构,如ISNULL这样的基本结构,但也像SQL 2005和2008中添加的公共表表达式和其他更高级的结构。当你开始编写复杂的命名查询时,这变得很重要。
  3. SQLite的datetime比SQL Server的
  4. 具有更大范围的可能值
  5. 当在事务范围中使用时,API NHibernate用于SQLite的行为与用于MS SQL Server的ADO.NET不同。一个例子是hbm-to-ddl工具,其Execute方法在与SQL Server的事务内部不起作用,但在SQLite中工作正常。
  6. 总而言之,基于SQLite的单元测试远非完全代表您在PROD中使用MS SQL Server时会遇到的问题,因此会破坏整体单元测试的可信度。

答案 1 :(得分:1)

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

顺便提一下,配置文件中有一个default_schema参数。这实际上是数据库名称,但您可以尝试将dbo放在那里,当然只针对SqlServer配置。

答案 2 :(得分: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,而空字符串则抛出异常...

感谢您的回答!