2012-04-26 12 views
7

Ich habe einige Beispiele zur Verwendung von NHibernate mit SQLite gefolgt, und die meisten von ihnen beziehen sich auf Unit-Tests Datenbank CRUD-Operationen und all das. Die Beispiele, die ich bisher gegoogelt und verfolgt habe, sind alle damit verbunden. Was ist nett, aber das Problem ist, dass jedes Mal, wenn ich mein Programm starte, die Datenbank neu erstellt wird! Wie kann ich meinen Code ändern, damit NHibernate ihn nicht erstellt, wenn die Datenbank bereits existiert? Und ja, ich habe versucht, mit File.Exists zu überprüfen, aber es wird ignoriert; Ich glaube, weil NHibernate zuerst an die Datei gelangt.Erstellen einer SQLite-Datenbank mit NHibernate, aber nur einmal

Das ist mein Mapping:

<?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> 

Und mein voller Code:

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

Antwort

6

Versuchen SchemaUpdate statt SchemaExport verwenden. SchmaExport wird alle Tabellen, Einschränkungen usw. löschen und neu erstellen. SchemaUpdate bringt Ihre Datenbank einfach auf den neuesten Stand. Allerdings warne ich die Verwendung von SchemaUpdate/SchemaExport in einer Produktionsumgebung, da es sich hierbei nicht um Migrationstools für Produktionsqualität handelt.

+0

Danke dir, Vadim, das hat wie ein Zauber funktioniert. Könnten Sie Ihre Vorsicht näher erläutern? Diese Tests, die ich mache, sollen für ein Desktop-Programm lernen, das ich mit SQLite und NHibernate erstellen möchte, und ich muss SQLite-Datenbanken automatisch aus dem Schema erstellen. Gibt es einen produktionsfertigen Weg? – CMPerez

+0

Worauf ich hinaus will ist, dass ich nicht von meiner Anwendung/nhibernate abhängig wäre, um die db und das Schema zu erstellen, wenn es bereitgestellt wird. Ich würde die Datenbank und das Schema manuell erstellen und dann die Anwendung bereitstellen. – Vadim

Verwandte Themen