2012-04-26 5 views
7

He estado siguiendo algunos ejemplos sobre cómo usar NHibernate con SQLite, y la mayoría de ellos están relacionados con las operaciones de unidad de base de datos CRUD y todo eso. Entonces, los ejemplos que busqué en Google y seguí hasta ahora están relacionados con eso. Lo cual es bueno, pero el problema es que cada vez que ejecuto mi programa, ¡la base de datos se crea de nuevo! ¿Cómo puedo modificar mi código para que, si la base de datos ya existe, NHibernate NO lo cree? Y sí, he intentado consultar con File.Exists, pero se ignora; Creo que porque NHibernate llega primero al archivo.Creando una base de datos SQLite con NHibernate, pero solo una vez

Esta es mi mapeo:

<?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> 

Y mi código 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(); 
     } 
    } 
} 

Respuesta

6

Trate de usar SchemaUpdate en lugar de SchemaExport. SchmaExport soltará todas las tablas, restricciones, etc. y las volverá a crear. SchemaUpdate simplemente actualizará su db. Sin embargo, advierto usar SchemaUpdate/SchemaExport en un entorno de producción, ya que no son herramientas de migración de calidad de producción.

+0

Gracias, Vadim, que funcionó a las mil maravillas. ¿Podrías dar más detalles sobre tu precaución? Estas pruebas que estoy haciendo están destinadas a aprender para un programa de escritorio que quiero construir usando SQLite y NHibernate, y necesito crear automáticamente bases de datos SQLite a partir del esquema. ¿Hay una manera lista para la producción de hacerlo? – CMPerez

+0

Lo que quiero decir es que no dependería de mi aplicación/nhibernate para crear el db y el esquema cuando se implemente. Yo crearía el db y el esquema manualmente y luego implementaría la aplicación. – Vadim

Cuestiones relacionadas