Как сделать, чтобы NHibernate 5.2.7 не имел исключений времени выполнения с ASP. NET Core 3.1? - PullRequest
0 голосов
/ 02 апреля 2020

В новом проекте, над которым работаем моя команда и я, я изучаю совместимость NHibernate 5.2.7 / FluentNHibernate 2.1.2 с ASP. NET Core 3.1. Я провел некоторое исследование NHibernate 5.2.3, немного более ранней версии , и в этом SO потоке они отметили, что NHibernate на этом этапе должен быть. NET Core-совместимым.

С это, как говорится, не похоже на то.

Ниже описано, как мы используем NHibernate. Мы создаем сеансы, используя этот объект DataContext (в блоке using, конечно, потому что ISessions равны IDisposable!), А затем используем QueryOver для извлечения или установки данных в нашу базу данных.

Однако когда мы пытаемся выполнить какие-либо операции с БД, мы получаем следующее исключение при вызове _sessionFactory.OpenSession():

Could not load type 'System.Runtime.Remoting.Messaging.CallContext' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Inner exception: null
Stack trace: at NHibernate.Impl.SessionIdLoggingContext.get_SessionId()
  at NHibernate.Impl.SessionIdLoggingContext..ctor(Guid id)
  at NHibernate.Impl.AbstractSessionImpl.BeginContext()
  at NHibernate.Impl.AbstractSessionImpl..ctor(ISessionFactoryImplementor factory, ISessionCreationOptions options)
  at NHibernate.Impl.SessionImpl..ctor(SessionFactoryImpl factory, ISessionCreationOptions options)
  at NHibernate.Impl.SessionFactoryImpl.SessionBuilderImpl`1.OpenSession()
  at NHibernate.Impl.SessionFactoryImpl.OpenSession()
  at MyRadProject.Core.DataContext.GetSession() in C:\MyRadProject.Core\DataContext.cs:line 18
  at MyRadProject.Core.Repositories.UserRepository.GetUsers(Boolean includeInactive) in C:\MyRadProject.Core\Repositories\UserRepository.cs:line 23
  at MyRadProject.Web.Controllers.CommonController.GetUsers() in C:\MyRadProject.Web\Controllers\CommonController.cs:line 21
  at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<<InvokeActionMethodAsync>g__Logged|12_1>d.MoveNext()

Насколько моя команда может сказать, это исключение ранее происходило в более ранних версиях из. NET Ядро из-за определенных пространств имен или классов, которые не были предусмотрены в. NET Ядро (например, System.Configuration.ConfigurationManager) К общему кредиту. NET Ядро и NHibernate эти проблемы кажутся значительно смягченными .

Я дважды проверил, что mscorlib упоминается в проекте библиотеки, в котором существует наш код доступа к данным ("MyAwesomeProject.Core"). В Visual Studio 2019 я не видел такой ссылки; когда я попытался вручную ссылаться на mscorlib, я получил сообщение «mscorlib автоматически ссылается на процесс сборки».

Все это приводит к моему вопросу:
Предполагая, что приведенный выше поток SO является точным, заявляя, что NHibernate 5.1.1+. NET Core-совместим, что еще мне нужно сделать, чтобы сделать так, чтобы NHibernate 5.2.7 не генерировал исключение времени выполнения, когда Я пытаюсь выполнить какую-либо операцию с базой данных?

DataContext.cs

public class DataContext
{
    private static ISessionFactory _sessionFactory;
    private static bool _startupComplete;

    private static readonly object _locker = new object();

    public static ISession GetSession()
    {
        EnsureStartup();
        ISession session = _sessionFactory.OpenSession();  // EXCEPTION occurs here!
        session.BeginTransaction();
        return session;
    }

    public static void EnsureStartup()
    {
        if (!_startupComplete)
        {
            lock (_locker)
            {
                if (!_startupComplete)
                {
                    PerformStartup();
                    _startupComplete = true;
                }
            }
        }
    }

    private static void PerformStartup()
    {
        InitializeSessionFactory();
    }

    private static void InitializeSessionFactory()
    {
        Configuration configuration = BuildConfiguration();
        _sessionFactory = configuration.BuildSessionFactory();
    }

    public static Configuration BuildConfiguration()
    {
        var configuration = new Configuration().Configure();
        return Fluently.Configure(configuration)
            .Mappings(cfg => cfg.FluentMappings.AddFromAssembly(typeof(DataContext).Assembly))
            .BuildConfiguration();
    }

    // There are other methods below this point that aren't pertinent to the question.
}

1 Ответ

1 голос
/ 02 апреля 2020

Кажется, вы используете Full. NET Версия библиотеки для платформы, так как CallContext класс не используется в. NET Core /.NET Стандартная версия NHibernate (вместо нее используется AsyncLocal): https://github.com/nhibernate/nhibernate-core/blob/c0f50429722b4e061a0c6b40b720db17d33fc85e/src/NHibernate/Impl/SessionIdLoggingContext.cs#L60 -L65

Поэтому для решения проблемы попробуйте использовать. NET Core или. NET Стандартная версия библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...