Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Reflection;
- using FluentNHibernate.Cfg;
- using FluentNHibernate.Cfg.Db;
- using NHibernate;
- using NHibernate.Cfg;
- using NHibernate.Tool.hbm2ddl;
- namespace Oss.Core.Helpers.Test
- {
- public class InMemorySessionProvider
- {
- private static InMemorySessionProvider _instance;
- public static InMemorySessionProvider Instance => _instance ?? (_instance = new InMemorySessionProvider());
- private static ISessionFactory _sessionFactory;
- private static Configuration _configuration;
- private static SchemaExport _schemaExport;
- private static ISession _session;
- private InMemorySessionProvider() { }
- public void Initialize()
- {
- CreateSession();
- }
- private static void CreateSession()
- {
- //взимаме всички мапинг намират се в domain по дизайн
- var domain = Assembly.Load("Domain");
- var config = Fluently.Configure()
- .Database(SQLiteConfiguration.Standard.InMemory()
- .ConnectionString("Data Source=:memory:;Version=3;New=True")
- .ShowSql());
- config.Mappings(x => x.FluentMappings.AddFromAssembly(domain));
- config.ExposeConfiguration(cfg => { _configuration = cfg; }).BuildConfiguration();
- //създаваме fluent конфигурацията. в foreach сменяме dbo с "" иначе sqllite хвърля exception
- // оказва се че ако'dbName'dbo.'dbtable' тои си мисли че dbo e нова база
- foreach (var pc in _configuration.ClassMappings)
- {
- if (!pc.Table.Schema.Contains("dbo")) continue;
- var newName = pc.Table.Schema.Replace(".dbo", "");
- pc.Table.Schema = newName;
- }
- var a = _configuration.ClassMappings;
- _sessionFactory = _configuration.BuildSessionFactory();
- _schemaExport = new SchemaExport(_configuration);
- }
- public ISession OpenSession()
- {
- //създаваме новата сесия с заредената schema
- //и тук идва бъг-а които е труден за възпроизвеждане
- // Message: System.Data.SQLite.SQLiteException : SQL logic error
- //near "max": syntax error
- // теоритично трябва да имаш този проблем ако ползваш guid long bigInt
- //но не се възпроизвежда в отделните микросървиси в 10 микросървиса работи
- // в 2 хвърля грешка....
- //като интересното е че дори да смениш Long guid в 2та проблемни сървиса пак си хвърля грешката.
- _session = _sessionFactory.OpenSession();
- _schemaExport.Execute(false,
- true, false, _session.Connection,
- null);
- return _session;
- }
- public void Dispose()
- {
- _session.Close();
- _sessionFactory?.Dispose();
- _configuration = null;
- _schemaExport = null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment