9

私は SQLite で NHibernate を使用する方法についていくつかの例に従ってきました。それらのほとんどは、データベースの CRUD 操作などの単体テストに関連しています。したがって、これまでにグーグルで検索して追跡した例はすべてそれに関連しています。これは素晴らしいことですが、問題は、プログラムを実行するたびにデータベースが新しく作成されることです! データベースが既に存在する場合に NHibernate がデータベースを作成しないようにコードを変更するにはどうすればよいですか? はい、File.Exists で確認しようとしましたが、無視されました。NHibernate が最初にファイルに到達するためだと思います。

これは私のマッピングです:

<?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();
        }
    }
}
4

1 に答える 1

7

SchemaUpdateの代わりに使ってみてくださいSchemaExport。SchmaExport は、すべてのテーブル、制約などを削除して再作成します。SchemaUpdate は、データベースを最新の状態にするだけです。ただし、これらは本番品質の移行ツールではないため、本番環境で SchemaUpdate/SchemaExport を使用することに注意してください。

于 2012-04-26T16:54:52.800 に答える