问题使用源码:记忆:用它能够
-
06-07-2019 - |
题
我使用它能够为我dataacess,并对一段时间没有我一直在使用源码当地融合的试验。我一直在使用一个文件,但我想我会出:记忆:选项。当我火了任何的集成试验,该数据库的似乎是创建(它能够吐出来的创建表sql),但interfacting与数据库的原因一个错误。
有任何人每一个得到它能够工作与在一个存储器数据库?它甚至有可能吗?连串我使用的是这个:
Data Source=:memory:;Version=3;New=True
解决方案
只要与SQLite内存数据库的连接保持打开状态,它就会存在。在NHibernate的单元测试中使用它:
1.在测试开始时打开一个ISession(可能是[SetUp]方法)
2.在SchemaExport调用中使用该会话的连接。
3.在测试中使用相同的会话。
4.在测试结束时关闭会话(可能在[TearDown]方法中)。
其他提示
我能够使用源码的内存数据库,并避免具有重建的架构,每一个测试通过使用源码的 支持对于'共享缓', ,允许在存储器数据库以共享连接。
我有没有在下面 AssemblyInitialize (我采用MSTest):
配置它能够(流利)使用源码与以下连串:
FullUri=file:memorydb.db?mode=memory&cache=shared
使用配置,以创建一个hbm2ddl.SchemaExport 目,并执行它在一个单独的连接(但与同一连串再)。
- 离开这方面的开放,引用的一个静态现场,直到 AssemblyCleanup, 在这一点上,它是关闭和设置的。这是因为源码需要至少一个活动连接举行的关于存储器数据库知道它仍然需要及避免整理。
在每次试验之前运行,一个新的会议是创造和试运行中的交易是轧制在结束。
这里是一个例子组件测试级别的代码:
[TestClass]
public static class SampleAssemblySetup
{
private const string ConnectionString = "FullUri=file:memorydb.db?mode=memory&cache=shared";
private static SQLiteConnection _connection;
[AssemblyInitialize]
public static void AssemblyInit(TestContext context)
{
var configuration = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.ConnectionString(ConnectionString))
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.Load("MyMappingsAssembly")))
.ExposeConfiguration(x => x.SetProperty("current_session_context_class", "call"))
.BuildConfiguration();
// Create the schema in the database
// Because it's an in-memory database, we hold this connection open until all the tests are finished
var schemaExport = new SchemaExport(configuration);
_connection = new SQLiteConnection(ConnectionString);
_connection.Open();
schemaExport.Execute(false, true, false, _connection, null);
}
[AssemblyCleanup]
public static void AssemblyTearDown()
{
if (_connection != null)
{
_connection.Dispose();
_connection = null;
}
}
}
和一个基类的每个单元的测试类/夹具:
public class TestBase
{
[TestInitialize]
public virtual void Initialize()
{
NHibernateBootstrapper.InitializeSession();
var transaction = SessionFactory.Current.GetCurrentSession().BeginTransaction();
}
[TestCleanup]
public virtual void Cleanup()
{
var currentSession = SessionFactory.Current.GetCurrentSession();
if (currentSession.Transaction != null)
{
currentSession.Transaction.Rollback();
currentSession.Close();
}
NHibernateBootstrapper.CleanupSession();
}
}
资源管理可以改善,我承认,但这些单元的测试后在所有(的改进建议,欢迎!).
我们正在使用源码存储器我们所有的数据库试验。我们正在使用一个单一的ADO连接的测试是重新用于所有NH届会议开幕通过相同的试验。
- 之前的每一个试验:创建连接
- 创建模式在这个连接
- 运行测试。相同的连接是用于所有的会议
- 后测试:关闭连接
这还允许在运行测试几次会议包括在内。将它还创建了一次试验,因为阅读的映射的文件需要相当长的一段时间。
编辑
使用的共用缓存
由于系统。数据。源码1.0.82(或 源码3.7.13),还有一个 共享缓存, ,允许几个连接分享了相同的数据,也为 在存储器数据库.这使得建立在存储器数据库中的一种连接,并利用它在另一个。(我没有尝试过,但在理论上,这应工作):
- 变动的连接串
file::memory:?cache=shared
- 打开连接和创建模式
- 保持这种连接打开,直到结束试验
- 让NH创建其他连接(正常的行为)的过程中测试。
我有类似的问题,即使在如上所述打开ISession之后也持续存在,并且添加“Pooling = True; Max Pool Size = 1”。到我的连接字符串。它有所帮助,但我仍然遇到一些情况,在测试期间连接会关闭(通常是在提交事务之后)。
最终对我有用的是设置属性“connection.release_mode”。到“on_close”在我的SessionFactory配置中。
我在app.config文件中的配置现在看起来像这样:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<reflection-optimizer use="true" />
<session-factory>
<property name="connection.connection_string_name">testSqlLiteDB</property>
<property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.release_mode">on_close</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="query.substitutions">true=1;false=0</property>
</session-factory>
</hibernate-configuration>
希望它有所帮助!
只是猜测,但是NHibernate使用sqlite不支持的命令输出sql?
此外,如果您使用文件而不是内存会发生什么? (System.IO.Path.GetTempFileName()可以工作,我认为...)
我正在使用 Rhino Commons 。如果您不想使用Rhino Commons,您可以研究源代码,看看它是如何做到的。我遇到的唯一问题是SQLite不支持嵌套事务。这迫使我改变我的代码以支持集成测试。内存数据库中的集成测试非常棒,我认为这是一个公平的妥协。
我在SQLite内存数据库方面遇到了很多问题。 所以现在我们正在使用SQLite处理硬盘驱动器上的文件。
只想感谢决定。我试图解决这个问题几个月了,而我所要做的就是添加
FullUri=file:memorydb.db?mode=memory&cache=shared
到我的nhibernate配置文件中的连接字符串。也只使用带有* .hbm.xml而不是FNH的NHibernate,并且根本不需要修改我的代码!
当我忘记导入SQLite Nuget包时,我得到了同样的错误。