5

Chúng tôi có một ứng dụng sử dụng NHibernate/FluentNHibernate với một MsSqlConfiguration.MsSql2008.ConnectionString chỉ vào môi trường SQL của chúng tôi. Các máy chủ SQL có một vài cơ sở dữ liệu và chúng ta có thể kết nối với cơ sở dữ liệu khác nhau bằng cách sử dụng một quy ước như sau:Khi thử nghiệm NHibernate với một SQLite Trong cấu hình bộ nhớ, làm thế nào để bạn tạo một cơ sở dữ liệu khác?

public class FactseDatabaseConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     if (instance.EntityType.Namespace.EndsWith("Model.OtherEntities")) 
     { 
      instance.Schema("OtherDatabase.dbo"); 
     } 
    } 
} 

này hoạt động và các truy vấn chính xác được tạo ra để truy cập OtherDatabase. Vấn đề xảy ra khi chúng tôi muốn kiểm tra bằng cách sử dụng SQLiteConfiguration.Standard.InMemory() với SessionFactory của chúng tôi. Các thử nghiệm Persistence thất bại khi SQLite đang chuẩn bị:

System.Data.SQLite.SQLiteException : SQL logic error or missing database 
unknown database OtherDatabase 

Đây là lệnh nó tạo ra:

create table OtherDatabse.dbo_my_other_entity_table (
     Id UNIQUEIDENTIFIER not null, 
     ... other properties 
) 

Có cách nào tôi có thể thay đổi của tôi SQLiteConfiguration để có nó tạo ra 2 cơ sở dữ liệu trong bộ nhớ và, nếu vậy, làm thế nào? Hoặc tôi nên tạo một Phiên riêng biệt để thử nghiệm các thực thể khác này?

Trả lời

0

Tôi đã gặp vấn đề này rất giống nhau - (không còn nữa kể từ khi chúng tôi chuyển từ Sqlite sang SDB Server LocalDB để kiểm tra).

tôi làm vẫn có mã, những gì chúng tôi đã làm được cung cấp một thành phần mà cấu hình xem có nên sử dụng lược đồ hay không, như sau:

public class SqlLiteMappingsHelper : IMappingsHelper 
    { 
     public string TextColumnTableSpecification 
     { 
      get 
      { 
       // see sqlite faqs re: all varchars are very large whatever you specify 
       // http://www.sqlite.org/faq.html#q9 
       return "nvarchar(10)"; 
      } 
     } 

     public bool SchemasEnabled 
     { 
      get { return false; } 
     } 
    } 

(và một tương tự cho máy chủ sql với SchemasEnabled = true) - trong các trang web ứng dụng bạn nói với container IoC của bạn để sử dụng máy chủ sql một và trong ứng dụng thử nghiệm của bạn, bạn sử dụng một Sqlite. Sau đó, trong quy ước của bạn:

public void Apply(IClassInstance instance) 
{ 
    var helper = IoC.get<IMappingsHelper>(); 
    if (instance.EntityType.Namespace.EndsWith("Model.OtherEntities") && helper.SchemasEnabled) 
    { 
     instance.Schema("OtherDatabase.dbo"); 
    } 
} 
+0

Cảm ơn @ jenson-button-event, điều này có thể hiệu quả. Trước khi tôi thử nó, bạn có bất kỳ thông tin nào bạn có thể chia sẻ trên giải pháp SQL cục bộ không? Tôi có thể muốn thử điều đó. – shanabus

+2

Đây là phiên bản trong bộ nhớ của MSSQL Express 2012 được tạo cho các nhà phát triển. Đây là [mục nhập blog MSDN] (http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx) về nó và liên kết để [tải xuống MSSQL Express 2012] (http://msdn.microsoft.com/en-us/evalcenter/hh230763.aspx). Bạn cũng có thể nhận được nó thông qua một thuê bao MSDN nếu bạn có một. Chỉ cần tìm kiếm LocalDB trong tải xuống thuê bao MSDN. –