Какой самый простой и эффективный способ убедиться, что ваша база данных SQLite действительно существует после использования инструмента создания схем NHib?
Cheers,
Berryl
EDIT
Я надеюсь, что есть что-то связанное с ISession (например, свойство соединения), которое можно протестировать;иногда при выполнении серии тестов это выглядит как хороший сеанс (IsOpen & IsConnected имеют значение true), но база данных отсутствует (запрос на нее выдает ошибку типа «нет такой таблицы»).
EDIT -ЧТО Я ДЕЛАЮ СЕЙЧАС
Строка подключения и другие свойства cfg
public static Configuration GetSQLiteConfig()
{
return new Configuration()
.SetProperty(ENV.Dialect, typeof (SQLiteDialect).AssemblyQualifiedName)
.SetProperty(ENV.ConnectionDriver, typeof (SQLite20Driver).AssemblyQualifiedName)
.SetProperty(ENV.ConnectionString, "Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1")
.SetProperty(ENV.ProxyFactoryFactoryClass, typeof (ProxyFactoryFactory).AssemblyQualifiedName)
.SetProperty(ENV.ReleaseConnections, "on_close")
.SetProperty(ENV.CurrentSessionContextClass, typeof (ThreadStaticSessionContext).AssemblyQualifiedName);
}
Как я проверяю БД сейчас, из-за отсутствия чего-то «лучшего» (это проверяет сопоставления)
public static void VerifyAllMappings(ISessionFactory sessionFactory, ISession session)
{
Check.RequireNotNull<ISessionFactory>(sessionFactory);
Check.Require(session.IsOpen && session.IsConnected);
_verifyMappings(sessionFactory, session);
}
private static void _verifyMappings(ISessionFactory sessionFactory, ISession session) {
try {
foreach (var entry in sessionFactory.GetAllClassMetadata())
{
session.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco))
.SetMaxResults(0).List();
}
}
catch (Exception ex) {
Console.WriteLine(ex);
throw;
}
}
public static void VerifyAllMappings(ISessionFactory sessionFactory, ISession session)
{
Check.Require(!sessionFactory.IsClosed);
Check.Require(session.IsOpen && session.IsConnected);
try {
foreach (var entry in sessionFactory.GetAllClassMetadata())
{
session.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco))
.SetMaxResults(0).List();
}
}
catch (Exception ex) {
Debug.WriteLine(ex);
throw;
}
}
Я генерирую схему в поставщике сеансов каждый раз, когда открывается новый сеанс:
public ISession Session
{
get
{
var session = (ISession)CallContext.GetData(_lookupSessionKey);
try
{
if (session == null)
{
_log.Debug("Opening new Session for this context.");
session = FactoryContext.Factory.OpenSession();
if(RunTypeBehaviorQualifier != RunType.Production)
SchemaManager.GenerateNewDb(FactoryContext.Cfg, session.Connection);
CallContext.SetData(_lookupSessionKey, session);
}
}
catch (HibernateException ex)
{
throw new InfrastructureException(ex);
}
return session;
}
}
Теперь все это, вероятно, слишком сложно, но мне нужно несколько соединений с базой данных, и у меня былопроблема в том, чтобы держать его проще и работать.Это также много информации для одного вопроса, но, может быть, кто-то на самом деле отнес все это к науке.Тест, приведенный ниже, прекрасно работает в своем собственном тестовом устройстве, но не в сочетании с другими тестами.
[Test]
public void Schema_CanGenerateNewDbWithSchemaApplied()
{
DbMappingTestHelpers.VerifyAllMappings(_dbContext.FactoryContext.Factory, _dbContext.Session);
}