2011-01-19 27 views
5

Cercando di giocare con IInterceptor in NHibernate 2.1.2.4000 Ho il seguente pezzo di codice di prova:Perché hbm2ddl.SchemaExport non viene eseguito qui?

public class TestingNHibernateInterceptors 
{ 
    [Fact] 
    public void can_intercept_delete_for_audit_log() 
    { 
     FullyConfigureDb(); 
     Session(s => s.Linq<Person>().Any().ShouldBe(false)); 
    } 
    ISessionFactory _sessions; 
    void Session(Action<ISession> @do) 
    { 
     using (var s = _sessions.OpenSession()) 
     { 
      @do(s); 
      s.Flush(); 
     } 
    } 
    void FullyConfigureDb() 
    { 
     var cfg = CreateConfig(); 
     _sessions = cfg.BuildSessionFactory(); 
     BuildSchema(cfg); 
    } 
    Configuration CreateConfig() 
    { 
     return Fluently.Configure() 
      .Database(new SQLiteConfiguration().InMemory()) 
      .Mappings(x => x.FluentMappings.Add<PersonMap>()) 
      .BuildConfiguration() 
      .SetProperty("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle") 
      .SetProperty("show_sql", "true"); 
    } 
    void BuildSchema(Configuration config) 
    { 
     var se = new NHibernate.Tool.hbm2ddl.SchemaExport(config); 
     se.Execute(false, true, false, _sessions.OpenSession().Connection, null); 
    } 
    public class Person 
    { 
     public virtual Guid Id { get; private set; } 
     public virtual string Name { get; set; } 
    } 
    public class PersonMap : ClassMap<Person> 
    { 
     public PersonMap() 
     { 
      Id(x => x.Id); 
      Map(x => x.Name); 
     } 
    } 
    public class AuditInterceptor : EmptyInterceptor, IInterceptor 
    { 
     public override void OnDelete(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types) 
     { 
      base.OnDelete(entity, id, state, propertyNames, types); 
     } 
    } 
} 

Tuttavia. Continuo a ricevere il messaggio:

fallito: NHibernate.ADOException: non poteva eseguire la query [SELECT COUNT (*) FROM come y0_ "Persona" this_] [SQL: SELECT count (*) come y0_ DA this_] ---- System.Data.SQLite.SQLiteException "persona": errore di SQLite

Schema di esportazione sembra funzionare - perché è il tavolo non viene creato?

Suppongo che questo abbia a che fare con l'utilizzo di una memoria in sqllite ma non si sa quale sia il problema. Qualche idea?

risposta

3

stato lì, fatto che, fatto male troppo ;-)

Una volta che la sessione viene rilasciato, il database viene sostanzialmente eliminato. Quando si utilizzano sessioni diverse durante la creazione dello schema e durante l'esecuzione dei test, lo schema non esiste più quando viene eseguito il test.

Vedere questo post da Justin per una spiegazione molto chiara.

Problemi correlati