2012-04-26 24 views
7

Tôi đã làm theo một số ví dụ về cách sử dụng NHibernate với SQLite, và hầu hết trong số chúng có liên quan đến các hoạt động CRUD cơ sở dữ liệu thử nghiệm đơn vị và tất cả. Vì vậy, các ví dụ tôi đã googled và theo sau cho đến nay là tất cả liên quan đến điều đó. Đó là tốt đẹp, nhưng vấn đề là mỗi khi tôi chạy chương trình của tôi cơ sở dữ liệu được tạo ra một lần nữa! Làm thế nào tôi có thể sửa đổi mã của tôi để nếu cơ sở dữ liệu đã tồn tại NHibernate không tạo ra nó? Và có, tôi đã cố gắng kiểm tra với File.Exists, nhưng nó bị bỏ qua; Tôi tin rằng vì NHibernate được tập tin đầu tiên.Tạo một cơ sở dữ liệu SQLite với NHibernate, nhưng chỉ một lần

Đây là bản đồ của tôi:

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

Và mã đầy đủ của tôi:

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

Trả lời

6

Hãy thử sử dụng SchemaUpdate thay vì SchemaExport. SchmaExport sẽ thả tất cả các bảng, ràng buộc, vv và tạo lại chúng. SchemaUpdate sẽ chỉ cập nhật db của bạn. Tuy nhiên, tôi thận trọng khi sử dụng SchemaUpdate/SchemaExport trong môi trường sản xuất vì đây không phải là công cụ di chuyển chất lượng sản xuất.

+0

Cảm ơn bạn, Vadim, đã làm việc như một sự quyến rũ. Bạn có thể giải thích về sự thận trọng của bạn? Những thử nghiệm này tôi đang cố gắng tìm hiểu về một chương trình máy tính để bàn mà tôi muốn xây dựng bằng cách sử dụng SQLite và NHibernate, và tôi cần phải tự động tạo cơ sở dữ liệu SQLite từ lược đồ. Có cách nào để sản xuất không? – CMPerez

+0

Những gì tôi đang nhận được, là tôi sẽ không phụ thuộc vào ứng dụng của tôi/nhibernate để tạo ra db và lược đồ khi nó được triển khai. Tôi sẽ tạo db và lược đồ theo cách thủ công và sau đó triển khai ứng dụng. – Vadim

Các vấn đề liên quan