Using NHibernate with SQLite

獨木發表於2013-08-25

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/

相關文章