Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating an SQLite database with NHibernate, but just once

I've been following some examples about how to use NHibernate with SQLite, and most of them are related to unit testing database CRUD operations and all that. So, the examples I've googled and followed so far are all related to that. Which is nice, but the problem is that everytime I run my program the database is created anew! How can I modify my code so that if the database already exists NHibernate does NOT create it? And yes, I've tried to check with File.Exists, but it's ignored; I believe because NHibernate gets to the file first.

This is my mapping:

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

And my full code:

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();
        }
    }
}
like image 522
CMPerez Avatar asked Apr 26 '12 15:04

CMPerez


1 Answers

Try using SchemaUpdate instead of SchemaExport. SchmaExport will drop all tables, constraints, etc and recreate them. SchemaUpdate will just bring your db up to date. However, I caution using SchemaUpdate/SchemaExport in a production environment as these are not production quality migration tools.

like image 138
Vadim Avatar answered Oct 16 '22 04:10

Vadim