Using NHibernate with SQLite
The most convenient method to add NHibernate and SQLite for C# project is using NuGet. You can check that in [1]. But I prefer a more free way to do it with NAnt. Let's do it.
Step 1, download all packages from official websites.
Step 2, set up the directory structure
For SQLite files:
For NHibernate files:
Step 3, create your domain entity class.
// Product.cs
namespace NHExample.Domain { public class Product { public virtual Guid Id { get; set; } public virtual string Name { get; set; } public virtual string Category { get; set; } public virtual int Price { get; set; } } }
Step 4, create the mapping file Product.hbm.xml.
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHExample" namespace="NHExample.Domain"> <class name="Product" table="products"> <id name="Id"> <generator class="guid" /> </id> <property name="Name" /> <property name="Category" /> <property name="Price" /> </class> </hibernate-mapping>
Step 5, create NHibernate configuration file hibernate.cfg.xml.
<?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="connection.connection_string">Data Source=nhibernate.db;Version=3</property> <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> <property name="query.substitutions">true=1;false=0</property> <property name="show_sql">true</property> </session-factory> </hibernate-configuration>
Step 6, create a driver for it
// NHExample.cs using System; using System.Linq; using NHibernate; using NHibernate.Cfg; using NHibernate.Tool.hbm2ddl; namespace NHExample { class NHExample { static void Main(string[] args) { // Initialize NHibernate var cfg = new Configuration(); cfg.Configure(); cfg.AddAssembly(typeof(Domain.Product).Assembly); // Get ourselves an NHibernate Session var sessions = cfg.BuildSessionFactory(); var sess = sessions.OpenSession(); // Create the database schema new SchemaExport(cfg).Create(true, true); // Create a Product... var product = new Domain.Product { Name = "Some C# Book", Price = 500, Category = "Books" }; // And save it to the database sess.Save(product); sess.Flush(); // Note that we do not use the table name specified // in the mapping, but the class name, which is a nice // abstraction that comes with NHibernate IQuery q = sess.CreateQuery("FROM Product"); var list = q.List<Domain.Product>(); // List all the entries' names list.ToList().ForEach( p => Console.WriteLine( p.Name )); } } }
Step 7, create a NAnt script.
<?xml version="1.0"?> <project name="SQLite with NHibernate" default="run"> <property name="debug" value="true" /> <property name="outdir" value="bin" /> <property name="libdir" value="../lib" /> <property name="sqlite_libdir" value="../../sqlite/lib" /> <target name="clean" description="remove all generated files"> <delete dir="${outdir}" /> </target> <target name="build" description="compiles the source code"> <mkdir dir="${outdir}" /> <csc debug="${debug}" output="${outdir}/NHExample.exe" target="exe"> <references basedir="${libdir}"> <include name="NHibernate.dll" /> </references> <sources> <include name="Domain/Product.cs" /> <include name="NHExample.cs" /> </sources> <resources dynamicprefix="true" prefix="NHExample.Domain"> <include name="Mappings/*.hbm.xml" /> </resources> </csc> <copy todir="${outdir}"> <fileset basedir="${libdir}"> <include name="NHibernate.dll" /> <include name="NHibernate.xml" /> <include name="Iesi.Collections.dll" /> <include name="Iesi.Collections.xml" /> </fileset> </copy> <copy todir="${outdir}"> <fileset basedir="etc"> <include name="hibernate.cfg.xml" /> </fileset> </copy> <copy todir="${outdir}"> <fileset basedir="${sqlite_libdir}"> <include name="System.Data.SQLite.dll" /> <include name="System.Data.SQLite.xml" /> </fileset> </copy> <copy todir="${outdir}/x64"> <fileset basedir="${sqlite_libdir}/x64"> <include name="SQLite.Interop.dll" /> </fileset> </copy> <copy todir="${outdir}/x86"> <fileset basedir="${sqlite_libdir}/x86"> <include name="SQLite.Interop.dll" /> </fileset> </copy> </target> <target name="run" depends="build"> <exec program="${outdir}/NHExample.exe" workingdir="${outdir}"/> </target> </project>
Step 8, build and run it
Links:
NHibernate: http://nhforge.org/
SQLite.NET: http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
References:
[1] http://coding-journal.com/setting-up-nhibernate-with-sqlite-using-visual-studio-2010-and-nuget/