5

Mamy aplikację, która używa NHibernate/FluentNHibernate z MsSqlConfiguration.MsSql2008.ConnectionString wskazał na nasze środowisko SQL. Serwery SQL posiada kilka baz danych i możemy połączyć się z różnych baz danych za pomocą konwencję tak:Podczas testowania NHibernate z konfiguracją SQLite In Memory, w jaki sposób tworzysz inną bazę danych?

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

To działa i poprawne zapytania są generowane na dostęp do OtherDatabase. Problem pojawia się, gdy chcemy przetestować przy użyciu naszego SessionFactory, używając SQLiteConfiguration.Standard.InMemory(). Testy Trwałość niepowodzenie podczas SQLite przygotowuje:

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

To polecenie generuje:

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

Czy istnieje sposób mogę zmienić SQLiteConfiguration aby stworzyć 2 w pamięci baz danych i, Jeśli tak to jak? Czy powinienem po prostu utworzyć oddzielną sesję do testowania tych innych podmiotów?

Odpowiedz

0

Miałem ten sam problem - (nie dłużej, ponieważ przeszliśmy od Sqlite do Sql Server LocalDB do testów).

zrobić jeszcze kodu, co zrobiliśmy było dostarczenie składnik, który konfiguruje czy użyć schematów, czy nie, w następujący sposób:

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

(i jeden podobny do serwera sql z SchemasEnabled = true) - w internecie aplikacja poinformuje kontener IoC, aby użył serwera sql i w aplikacji testowej używasz Sqlite. Następnie w swoim konwencie:

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

Dzięki @ jenson-button-event, to może działać. Zanim spróbuję, czy masz jakieś informacje, które możesz udostępnić w lokalnym rozwiązaniu SQL? Wolę to wypróbować. – shanabus

+2

Jest to edycja pamięci MSSQL Express 2012 przeznaczona dla programistów. Oto [wpis na blogu MSDN] (http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx) na ten temat oraz link pobrać [pobierz MSSQL Express 2012] (http://msdn.microsoft.com/en-us/evalcenter/hh230763.aspx). Możesz go również uzyskać przez subskrypcję MSDN, jeśli ją posiadasz. Po prostu wyszukaj LocalDB w pobraniach subskrybentów MSDN. –

Powiązane problemy