我正在尝试实施此解决方案: 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 = "";
}
[dbo]
(我试过attach database :memory: as dbo
,但这似乎没有帮助)? 答案 0 :(得分:7)
我们在SQLite上遇到了太多问题,最终迫使我们切换到SQL Express。 我记得的问题:
总而言之,基于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,而空字符串则抛出异常...
感谢您的回答!