2011-09-26 99 views
1

我有一个问题,我已将我的(工作)多数据库NHibernate解决方案切换到DI会话工厂,以便我可以使用我的集成测试套件中的SqlLite。与多个NHibernate会话工厂的SQLite

虽然我可以使用一个物理文件,我可以使用多个文件名,每个数据库有一个工作(见下面的代码),但我不确定如何在内存中执行该操作。也许它只是在内存中由sqlite造成的限制?会发生什么情况是,即使每个工厂在当前线程上都有自己的密钥,每次后续调用InMemory()都会覆盖现有的一个。

public override Configuration BuildSessionFactoryFor(string databaseName, bool showSql, IsolationLevel level) 
    { 
     Configuration cfg = null; 

     var filename = @"c:\temp\{0}-test.db".Substitute(databaseName); 
     if (File.Exists(filename)) File.Delete(filename); 

     var sqlConfig = 
     SQLiteConfiguration.Standard.ShowSql().UsingFile(filename); //.InMemory() 

     var sessionFactory = Fluently.Configure() 
     .Database(sqlConfig) 
     .ProxyFactoryFactory(typeof (ProxyFactoryFactory)) 
     .Mappings(m => 
        m.AutoMappings.Add(
        new AutoPersistenceModelGenerator().GenerateSchema(databaseName) 
        ) 
     ) 
     .ExposeConfiguration(c => 
      { 
      new SchemaExport(c).Execute(false, true, false); 
      cfg = c; 
      }) 
     .BuildSessionFactory(); 

     NHibernateSession.AddConfiguration(FactoryKeyFor(databaseName), sessionFactory, cfg, null); 

     return cfg; 
    } 

回答

0

您可能关闭或配置NHIbernate会话。内存数据库的范围不是ISessionFactory。它是ISession,所以每次你明确地关闭它或者在一个'using'语句中,数据库都会消失。

In-Memory Databases

数据库不再作为 数据库连接关闭后立即存在。每个:内存:数据库是独立的 彼此不同。因此,打开两个名为“:memory:”的数据库连接将创建两个独立的内存数据库。

+0

感谢这让我有了一个反思。我现在已经重构了我的测试,以便每次考虑这个并使用ayende的示例来设置和拆卸db&session:http://ayende.com/blog/3983/nhibernate-unit-testing –