使用Sqlite InMemory DB进行单元测试MSSQL-DB

4 sql-server sqlite nhibernate unit-testing in-memory

我正在尝试实现这个解决方案: NHibernate-20-SQLite-and-In-Memory-Databases

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

<class name="aTable" table="[dbo].[aTable]" mutable="true" lazy="false">
Run Code Online (Sandbox Code Playgroud)

[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 = "";
    }
Run Code Online (Sandbox Code Playgroud)
  • 有没有办法告诉Sqlite忽​​略[dbo](我试过attach database :memory: as dbo,但这似乎没有帮助)?
  • 或者,我可以以编程方式从类映射中删除它(遗憾的是,现在无法更改hbms)?

zvo*_*kov 7

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

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

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

  • 当然我们会在Buildserver上运行Mssql上的测试,在我们想用sqlite运行的Dev-pc上出于性能原因.它丢弃数据库是一个奖励.我们主要通过nhibernate工作,所以如果我们想要复杂的命名查询,那么缺少复杂的运算符只会影响我们,或者?另请注意:mssql-express的性能如何?我可以轻松地创建丢弃dbs吗? (3认同)

Ste*_*ger 1

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

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