2012-04-26 5 views
7

Ho seguito alcuni esempi su come utilizzare NHibernate con SQLite e la maggior parte di essi sono relativi alle operazioni CRUD del database di test delle unità e tutto il resto. Quindi, gli esempi che ho cercato su google e seguito fino ad ora sono tutti relativi a questo. Il che è bello, ma il problema è che ogni volta che eseguo il mio programma il database viene creato di nuovo! Come posso modificare il mio codice in modo che se il database esiste già, NHibernate NON lo crea? E sì, ho provato a verificare con File.Exists, ma è ignorato; Credo che NHibernate arrivi prima al file.Creazione di un database SQLite con NHibernate, ma solo una volta

Questo è il mio mappatura:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory name="NHibernate.Test"> 
    <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property> 
    <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> 
    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> 
    <property name="query.substitutions">true=1;false=0</property> 
    <property name="show_sql">false</property> 
    </session-factory> 
</hibernate-configuration> 

E il mio codice completo:

using System; 
using System.Collections.Generic; 
using System.Data.SQLite; 
using System.Linq; 
using NHibernate; 
using NHibernate.Cfg; 
using PruebaNHLite.Domain; 

namespace PruebaNHLite 
{ 
    public class Program 
    { 
     public static ISession sess; 
     public static Configuration cfg; 
     public static SQLiteConnection connection; 
     private const string CONNECTION_STRING = 
       @"Data Source=nhlite.db;Pooling=true;FailIfMissing=false; 
           BinaryGUID=false;New=false;Compress=true;Version=3"; 

     static void Main(string[] args) 
     { 
      Init(); 
      BuildSchema(); 
      Insert(); 
      Retrieve(); 
      sess.Close(); 
      sess = null; 
     } 

     public static void Init() 
     { 
      // Initialize NHibernate 
      cfg = new Configuration(); 
      cfg.Configure(); 
      IDictionary<string, string> props = new Dictionary<string, string>(); 
      props.Add("connection.connection_string", CONNECTION_STRING); 
      props.Add("connection.driver_class", "NHibernate.Driver.SQLite20Driver"); 
      props.Add("dialect", "NHibernate.Dialect.SQLiteDialect"); 
      props.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu"); 
      props.Add("query.substitutions", "true=1;false=0"); 
      props.Add("show_sql", "false"); 
      cfg.SetProperties(props); 
      cfg.AddAssembly(typeof(Person).Assembly); 
      connection = new SQLiteConnection(CONNECTION_STRING); 
      connection.Open(); 

      // Get ourselves an NHibernate Session 
      var sessions = cfg.BuildSessionFactory(); 
      sess = sessions.OpenSession(); 
     } 

     private static void BuildSchema() 
     { 
      NHibernate.Tool.hbm2ddl.SchemaExport schemaExport 
       = new NHibernate.Tool.hbm2ddl.SchemaExport(cfg); 
      schemaExport.Execute(false, true, false, connection, null); 
     } 

     public static void Insert() 
     { 
      // Create a Person... 
      var person = new Person 
      { 
       Name = "Almudena", 
       Surname = "Pamplinas", 
       Age = 5 
      }; 

      // And save it to the database 
      sess.Save(person); 
      sess.Flush(); 
     } 

     public static void Retrieve() 
     { 
      IQuery q = sess.CreateQuery("FROM Person"); 
      foreach (var p in q.List().Cast<Person>()) 
      { 
       Console.WriteLine(string.Format("{0} {1}, de {2} años.", 
               p.Name, p.Surname, p.Age)); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

risposta

6

Provate ad usare SchemaUpdate invece di SchemaExport. SchmaExport eliminerà tutte le tabelle, i vincoli, ecc. E li ricreerà. SchemaUpdate ti aggiornerà con il tuo db. Tuttavia, si consiglia di utilizzare SchemaUpdate/SchemaExport in un ambiente di produzione poiché questi non sono strumenti di migrazione della qualità di produzione.

+0

Grazie, Vadim, che ha funzionato come un fascino. Potresti approfondire la tua prudenza? Questi test che sto facendo hanno lo scopo di apprendere per un programma desktop che voglio costruire usando SQLite e NHibernate, e ho bisogno di creare automaticamente database SQLite dallo schema. C'è un modo di produzione pronto per farlo? – CMPerez

+0

Quello che sto ottenendo, è che non dipenderei dalla mia applicazione/nhibner per creare il db e lo schema quando viene distribuito. Vorrei creare manualmente il db e lo schema e quindi distribuire l'applicazione. – Vadim

Problemi correlati