私はNHibernateをSQLiteでどのように使用するかに関するいくつかの例を追ってきましたが、そのほとんどは単体テストのデータベースCRUD操作とそのすべてに関連しています。だから、これまで私がグーグルで行った例とそれに関連した例はすべて関連しています。どちらがいいですか?問題は、プログラムを実行するたびにデータベースが新たに作成されることです。データベースがすでに存在する場合、NHibernateはそれを作成しないように自分のコードを変更する方法はありますか?そして、はい、私はFile.Existsでチェックしようとしましたが、無視されます。私はNHibernateが最初にファイルに到達するので、私は信じています。NHibernateを使用したSQLiteデータベースを1回だけ作成する
これが私のマッピングです:
<?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>
そして、私の完全なコード:
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();
}
}
}
ありがとう、ヴァディム、それは魅力のように働いた。あなたは注意を凝らすことができますか?私がやっているこれらのテストは、SQLiteとNHibernateを使ってビルドしたいデスクトッププログラムを学ぶためのもので、スキーマからSQLiteデータベースを自動的に作成する必要があります。それを行う準備ができている方法はありますか? – CMPerez
私が得意なのは、デプロイ時にdbとスキーマを作成するために、自分のアプリケーション/ nhibernateに依存しないということです。私はdbとスキーマを手動で作成してから、アプリケーションをデプロイします。 – Vadim