5

我们有一个应用程序使用 NHibernate/FluentNHibernate 并MsSqlConfiguration.MsSql2008.ConnectionString指向我们的 SQL 环境。SQL 服务器有多个数据库,我们可以使用如下约定连接到不同的数据库:

public class FactseDatabaseConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        if (instance.EntityType.Namespace.EndsWith("Model.OtherEntities"))
        {
            instance.Schema("OtherDatabase.dbo");
        }
    }
}

这有效,并且生成了正确的查询来访问OtherDatabase. 当我们想要使用SQLiteConfiguration.Standard.InMemory()SessionFactory 进行测试时,问题就出现了。SQLite 准备时持久性测试失败:

System.Data.SQLite.SQLiteException : SQL logic error or missing database
unknown database OtherDatabase

这是它生成的命令:

create table OtherDatabse.dbo_my_other_entity_table (
        Id UNIQUEIDENTIFIER not null,
        ... other properties
)

有没有办法改变我SQLiteConfiguration的,让它创建2个内存数据库,如果是这样,怎么做?还是我应该创建一个单独的会话来测试这些其他实体?

4

1 回答 1

0

我遇到了同样的问题-(不再是因为我们从 Sqlite 转移到 Sql Server LocalDB 进行测试)。

我仍然有代码,我们所做的是提供一个组件来配置是否使用模式,因此:

public class SqlLiteMappingsHelper : IMappingsHelper
    {
        public string TextColumnTableSpecification
        {
            get
            {
                // see sqlite faqs re: all varchars are very large whatever you specify
                // http://www.sqlite.org/faq.html#q9
                return "nvarchar(10)";
            }
        }

        public bool SchemasEnabled
        {
            get { return false; }
        }
    }

(和一个类似的 sql server with SchemasEnabled = true) - 在 web 应用程序中,您告诉您的 IoC 容器使用 sql server 一个,而在您的测试应用程序中,您使用 Sqlite 一个。然后在您的约定中:

public void Apply(IClassInstance instance)
{
    var helper = IoC.get<IMappingsHelper>();
    if (instance.EntityType.Namespace.EndsWith("Model.OtherEntities") && helper.SchemasEnabled)
    {
        instance.Schema("OtherDatabase.dbo");
    }
}
于 2013-09-06T16:05:27.403 回答