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();
}
}
}
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
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