2010-12-01 5 views
4

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.

Répondre

3

Si vous changez votre méthode de test par ce qui suit, cela fonctionne-t-il?

[Test] 
public void CanGetStudentById() 
{ 
    using (var scope = new SQLiteDatabaseScope<StudentMapping>()) 
    { 
     using (ISession sess = scope.OpenSession()) 
     { 
      // Arrange 
      sess.Save(new Student() { Name = "Text1", DoB = DateTime.Now }); 

      // Act 
      var student = sess.Get<Student>(1); 

      // Assert 
      Assert.IsNotNull(student); 
      Assert.AreEqual("Text1", student.Name); 
     } 
    } 
} 

Je risquerais de deviner que votre StudentRepository ouvre sa propre session et par conséquent, ne voit pas la table.

+0

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! –

+0

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(). –

Questions connexes