В новом проекте, над которым работаем моя команда и я, я изучаю совместимость 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.
}