2012-04-26 10 views
7

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

答えて

6

SchemaUpdate代わりのSchemaExportを使用してみてください。 SchmaExportはすべてのテーブル、制約などを削除し、それらを再作成します。 SchemaUpdateはあなたのdbを最新のものにするだけです。ただし、本番環境ではSchemaUpdate/SchemaExportを使用することに注意します。これは、プロダクション品質の移行ツールではないためです。

+0

ありがとう、ヴァディム、それは魅力のように働いた。あなたは注意を凝らすことができますか?私がやっているこれらのテストは、SQLiteとNHibernateを使ってビルドしたいデスクトッププログラムを学ぶためのもので、スキーマからSQLiteデータベースを自動的に作成する必要があります。それを行う準備ができている方法はありますか? – CMPerez

+0

私が得意なのは、デプロイ時にdbとスキーマを作成するために、自分のアプリケーション/ nhibernateに依存しないということです。私はdbとスキーマを手動で作成してから、アプリケーションをデプロイします。 – Vadim

関連する問題