5

Wir haben eine App, die NHibernate/FluentNHibernate mit einem MsSqlConfiguration.MsSql2008.ConnectionString auf unsere SQL-Umgebung hingewiesen. Der SQL-Server hat mehrere Datenbank und wir können wie so durch die Verwendung einer Konvention zu verschiedenen Datenbanken verbinden:Wie können Sie beim Testen von NHibernate mit einer SQLite In Memory-Konfiguration eine andere Datenbank erstellen?

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

Dies funktioniert und die richtigen Anfragen generiert werden, um die OtherDatabase zugreifen. Das Problem tritt auf, wenn wir mit unserer SessionFactory einen SQLiteConfiguration.Standard.InMemory() testen möchten. Die Persistenz Tests fehlschlagen, wenn SQLite bereitet:

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

Dies ist der Befehl es erzeugt:

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

Gibt es eine Weise, die ich meine SQLiteConfiguration es 2 Datenbanken und In-Memory erstellen haben, ändern kann, Wenn das so ist, wie? Oder sollte ich einfach eine separate Sitzung zum Testen dieser anderen Entitäten erstellen?

Antwort

0

Ich hatte das gleiche Problem - (nicht mehr seit wir von Sqlite zu Sql Server LocalDB für Tests verschoben).

ich immer noch den Code haben, was haben wir eine Komponente liefern wurde, die ob Schemata verwenden oder nicht konfiguriert, also:

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

(und eine ähnliche für SQL Server mit SchemasEnabled = true) - im Web App sagst du deinem IoC Container den sql Server zu benutzen und in deiner Test App benutzt du den Sqlite one. Dann in Ihrer Konvention:

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

Dank @ jenson-button-event, kann dies funktionieren. Bevor Sie es versuchen, haben Sie irgendwelche Informationen, die Sie für die lokale SQL-Lösung freigeben können? Ich werde es vielleicht lieber versuchen. – shanabus

+2

Es ist eine In-Memory-Edition von MSSQL Express 2012 für Entwickler erstellt. Hier ist ein [MSDN Blogeintrag] (http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx) darüber, und ein Link [MSSQL Express 2012 herunterladen] (http://msdn.microsoft.com/en-us/evalcenter/hh230763.aspx). Sie können es auch über ein MSDN-Abonnement erhalten, wenn Sie eines haben. Suchen Sie einfach nach LocalDB in den Downloads des MSDN-Abonnenten. –