J'essaie d'utiliser une base de données SQLite en mémoire pour tester ma couche de données fournie par NHibernate.Test de NHibernate avec SQLite "No Such Table" - schéma généré
J'ai lu un tas de blogs et d'articles sur l'obtention de cette configuration, mais je suis maintenant très confus quant à savoir pourquoi cela ne fonctionne pas. Le problème - quand j'exécute un test unitaire, j'obtiens l'erreur 'no such table: Student'. Les articles que j'ai lus suggèrent que c'est parce que le schéma n'est pas généré, ou, la connexion est fermée entre mon SchemaExport et la requête. J'ai vérifié partout où je peux penser et ne peux pas voir comment l'un ou l'autre de ces scénarios se produisent.
Mon test journal de sortie ressemble à ceci:
OPEN CONNECTION
drop table if exists "Student"
drop table if exists "Tutor"
create table "Student" (
ID integer,
Name TEXT,
DoB DATETIME,
TutorId INTEGER,
primary key (ID)
)
create table "Tutor" (
ID integer,
Name TEXT,
primary key (ID)
)
NHibernate: INSERT INTO "Student" (Name, DoB, TutorId) VALUES (@p0, @p1, @p2); select last_insert_rowid();@p0 = 'Text1', @p1 = 01/12/2010 14:55:05, @p2 = NULL
14:55:05,750 ERROR [TestRunnerThread] AbstractBatcher [(null)]- Could not execute query: INSERT INTO "Student" (Name, DoB, TutorId) VALUES (@p0, @p1, @p2); select last_insert_rowid()
System.Data.SQLite.SQLiteException (0x80004005): SQLite error
no such table: Student
at System.Data.SQLite.SQLite3.Prepare(String strSql, SQLiteStatement previous, String& strRemain)
at System.Data.SQLite.SQLiteCommand.BuildNextCommand()
at System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
14:55:05,781 ERROR [TestRunnerThread] ADOExceptionReporter [(null)]- SQLite error
no such table: Student
DISPOSE
CLOSING CONNECTION
Au départ, j'utilisais mon propre code pour la connexion/gestion de session, mais ont déménagé dans le code this blog post traduit en C# et avec un changement de couple à la La méthode DBConfig et quelques instructions de débogage pour montrer l'état de la connexion.
private FluentNHibernate.Cfg.Db.IPersistenceConfigurer GetDBConfig()
{
return SQLiteConfiguration.Standard
.ConnectionString((ConnectionStringBuilder cs) => cs.Is(CONNECTION_STRING))
.ProxyFactoryFactory("NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu")
.Raw("connection.release_mode", "on_close");
}
J'ai ajouté le on_close après avoir lu this
Mon code de test ressemble à ceci:
[Test]
public void CanGetStudentById()
{
using (var scope = new SQLiteDatabaseScope<StudentMapping>())
{
using (ISession sess = scope.OpenSession())
{
// Arrange
var repo = new StudentRepository();
repo.Save(new Student() { Name = "Text1", DoB = DateTime.Now });
// Act
var student = repo.GetById(1);
// Assert
Assert.IsNotNull(student);
Assert.AreEqual("Text1", student.Name);
}
}
}
Qu'ai-je oublié ici?
Mise à jour: J'ai créé une copie de la classe qui se connecte à un DB de fichier SQLite et cela a fonctionné correctement. Cela doit donc être quelque chose à voir avec la fermeture de la connexion.
Bien sûr! Merci beaucoup! C'est exactement ce que le problème est. Je ne sais pas comment je vais y travailler, mais au moins je sais ce que je fais maintenant :) Cela répond aussi à la question de savoir pourquoi mes tests étaient en conflit les uns avec les autres aussi! –
Jetez un oeil à Contextual Sessions (http://nhforge.org/doc/nh/en/index.html#architecture-current-session) et plus précisément CurrentSessionContext et ISessionFactory.GetCurrentSession(). –