diff --git a/Tools/packages.config b/Tools/packages.config
index abc3ac2be5f..73a899fb80c 100644
--- a/Tools/packages.config
+++ b/Tools/packages.config
@@ -7,6 +7,6 @@
-
+
diff --git a/build-common/NHibernate.props b/build-common/NHibernate.props
index 6fd6f167d5f..1c4f9de5b17 100644
--- a/build-common/NHibernate.props
+++ b/build-common/NHibernate.props
@@ -2,7 +2,7 @@
5
0
- 2
+ 3
$(VersionMajor).$(VersionMinor).$(VersionPatch)
diff --git a/build-common/common.xml b/build-common/common.xml
index 809899a1f13..2b69e9167c0 100644
--- a/build-common/common.xml
+++ b/build-common/common.xml
@@ -30,8 +30,8 @@
-
-
+
+
diff --git a/doc/reference/modules/performance.xml b/doc/reference/modules/performance.xml
index 533b179a038..4a629f0d5d9 100644
--- a/doc/reference/modules/performance.xml
+++ b/doc/reference/modules/performance.xml
@@ -943,11 +943,20 @@ sessionFactory.EvictCollection("Eg.Cat.Kittens");]]>
This setting causes the creation of two new cache regions - one holding cached query
result sets (NHibernate.Cache.StandardQueryCache), the other
- holding timestamps of the most recent updates to queryable tables
- (NHibernate.Cache.UpdateTimestampsCache). Note that the query
- cache does not cache the state of any entities in the result set; it caches
- only identifier values and results of value type. So the query cache should always be
- used in conjunction with the second-level cache.
+ holding timestamps of the most recent updates to queryable tables
+ (UpdateTimestampsCache). Those region names will be prefixed by the
+ cache region prefix if cache.region_prefix setting is configured.
+
+
+ If you use a cache provider handling an expiration for cached entries, you should set
+ the UpdateTimestampsCache region expiration to a value greater than
+ the expiration of query cache regions. (Or disable its expiration.) Otherwise the query
+ cache may yield stale data.
+
+
+ Note that the query cache does not cache the state of any entities in the result set;
+ it caches only identifier values and results of value type. So the query cache should
+ always be used in conjunction with the second-level cache.
diff --git a/releasenotes.txt b/releasenotes.txt
index 82e5fa16756..fae23a92f4c 100644
--- a/releasenotes.txt
+++ b/releasenotes.txt
@@ -1,4 +1,12 @@
-Build 5.0.2
+Build 5.0.3
+=============================
+
+Release notes - NHibernate - Version 5.0.3
+
+** Bug
+ * #1462 Fix disposing SessionIdLoggingContext if CheckAndUpdateSessionStatus is failed
+
+Build 5.0.2
=============================
Release notes - NHibernate - Version 5.0.2
diff --git a/src/AsyncGenerator.yml b/src/AsyncGenerator.yml
index accaaeabe72..7022d322eb6 100644
--- a/src/AsyncGenerator.yml
+++ b/src/AsyncGenerator.yml
@@ -4,8 +4,6 @@
applyChanges: true
analyzation:
methodConversion:
- - conversion: Ignore
- hasAttributeName: ObsoleteAttribute
- conversion: Ignore
name: PostProcessInsert
containingTypeName: HqlSqlWalker
@@ -96,6 +94,9 @@
- conversion: Ignore
name: Exists
containingTypeName: AbstractCollectionPersister
+ - conversion: Ignore
+ name: QuoteTableAndColumns
+ containingTypeName: SchemaMetadataUpdater
- conversion: ToAsync
name: ExecuteReader
containingTypeName: IBatcher
@@ -119,6 +120,8 @@
- name: GetFieldValue
- name: IsDBNull
- name: WriteLine
+ ignoreAsyncCounterparts:
+ - rule: Obsolete
callForwarding: true
cancellationTokens:
guards: true
@@ -259,6 +262,9 @@ methodRules:
- containingType: NHibernate.Tool.hbm2ddl.SchemaValidator
- containingType: NHibernate.Tool.hbm2ddl.SchemaExport
name: PubliclyExposedType
+- filters:
+ - hasAttributeName: ObsoleteAttribute
+ name: Obsolete
typeRules:
- filters:
- containingAssemblyName: NHibernate
diff --git a/src/NHibernate.DomainModel/Async/CustomPersister.cs b/src/NHibernate.DomainModel/Async/CustomPersister.cs
index 5fac317eb77..104cc514c36 100644
--- a/src/NHibernate.DomainModel/Async/CustomPersister.cs
+++ b/src/NHibernate.DomainModel/Async/CustomPersister.cs
@@ -21,6 +21,7 @@
using NHibernate.Tuple.Entity;
using NHibernate.Type;
using NHibernate.Util;
+using Array = System.Array;
namespace NHibernate.DomainModel
{
@@ -37,7 +38,7 @@ public Task FindDirtyAsync(object[] currentState, object[] previousState,
{
try
{
- if (!EqualsHelper.Equals(currentState[0], previousState[0]))
+ if (!Equals(currentState[0], previousState[0]))
{
return Task.FromResult(new int[] { 0 });
}
@@ -56,7 +57,7 @@ public Task FindModifiedAsync(object[] old, object[] current, object enti
{
try
{
- if (!EqualsHelper.Equals(old[0], current[0]))
+ if (!Equals(old[0], current[0]))
{
return Task.FromResult(new int[] { 0 });
}
diff --git a/src/NHibernate.DomainModel/Baz.cs b/src/NHibernate.DomainModel/Baz.cs
index 2f661a17675..acb2c846dcd 100644
--- a/src/NHibernate.DomainModel/Baz.cs
+++ b/src/NHibernate.DomainModel/Baz.cs
@@ -396,7 +396,7 @@ public void SetDefaults()
StringArray = StringSet.ToArray();
StringList = new List(StringArray);
IntArray = new int[] {1, 3, 3, 7};
- FooArray = new Foo[0];
+ FooArray = Array.Empty();
Customs = new List();
Customs.Add(new String[] {"foo", "bar"});
diff --git a/src/NHibernate.DomainModel/CustomPersister.cs b/src/NHibernate.DomainModel/CustomPersister.cs
index cb2c413f558..04ce8d6625b 100644
--- a/src/NHibernate.DomainModel/CustomPersister.cs
+++ b/src/NHibernate.DomainModel/CustomPersister.cs
@@ -11,6 +11,7 @@
using NHibernate.Tuple.Entity;
using NHibernate.Type;
using NHibernate.Util;
+using Array = System.Array;
namespace NHibernate.DomainModel
{
@@ -130,12 +131,12 @@ public bool[] PropertyInsertability
public ValueInclusion[] PropertyInsertGenerationInclusions
{
- get { return new ValueInclusion[0]; }
+ get { return Array.Empty(); }
}
public ValueInclusion[] PropertyUpdateGenerationInclusions
{
- get { return new ValueInclusion[0]; }
+ get { return Array.Empty(); }
}
public bool[] PropertyCheckability
@@ -254,7 +255,7 @@ public IType GetPropertyType(string propertyName)
public int[] FindDirty(object[] currentState, object[] previousState, object entity, ISessionImplementor session)
{
- if (!EqualsHelper.Equals(currentState[0], previousState[0]))
+ if (!Equals(currentState[0], previousState[0]))
{
return new int[] { 0 };
}
@@ -266,7 +267,7 @@ public int[] FindDirty(object[] currentState, object[] previousState, object ent
public int[] FindModified(object[] old, object[] current, object entity, ISessionImplementor session)
{
- if (!EqualsHelper.Equals(old[0], current[0]))
+ if (!Equals(old[0], current[0]))
{
return new int[] { 0 };
}
diff --git a/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs b/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs
index 663b9dfcbe8..38265648eda 100644
--- a/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs
+++ b/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs
@@ -13,7 +13,7 @@ public class AppSessionFactory
public AppSessionFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory)
{
- NHibernate.LoggerProvider.SetLoggersFactory(new NHibernateToMicrosoftLoggerFactory(loggerFactory));
+ NHibernate.NHibernateLogger.SetLoggersFactory(new NHibernateToMicrosoftLoggerFactory(loggerFactory));
var mapper = new ModelMapper();
mapper.AddMapping();
diff --git a/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLogger.cs b/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLogger.cs
index 829cd67b903..f83a7f20ef6 100644
--- a/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLogger.cs
+++ b/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLogger.cs
@@ -1,9 +1,11 @@
using System;
+using System.Collections.Generic;
using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Internal;
namespace NHibernate.Example.Web.Infrastructure
{
- public class NHibernateToMicrosoftLogger : IInternalLogger
+ public class NHibernateToMicrosoftLogger : INHibernateLogger
{
private readonly ILogger _msLogger;
@@ -12,122 +14,29 @@ public NHibernateToMicrosoftLogger(ILogger msLogger)
_msLogger = msLogger ?? throw new ArgumentNullException(nameof(msLogger));
}
- public void Error(object message)
+ private static readonly Dictionary MapLevels = new Dictionary
{
- if (IsErrorEnabled)
- {
- _msLogger.LogError(message.ToString());
- }
- }
-
- public void Error(object message, Exception exception)
- {
- if (IsErrorEnabled)
- {
- _msLogger.LogError(exception, message.ToString());
- }
- }
-
- public void ErrorFormat(string format, params object[] args)
- {
- if (IsErrorEnabled)
- {
- _msLogger.LogError(format, args);
- }
- }
-
- public void Fatal(object message)
- {
- if (IsFatalEnabled)
- {
- _msLogger.LogCritical(message.ToString());
- }
- }
-
- public void Fatal(object message, Exception exception)
- {
- if (IsFatalEnabled)
- {
- _msLogger.LogCritical(exception, message.ToString());
- }
- }
-
- public void Debug(object message)
- {
- if (IsDebugEnabled)
- {
- _msLogger.LogDebug(message.ToString());
- }
- }
+ { NHibernateLogLevel.Trace, LogLevel.Trace },
+ { NHibernateLogLevel.Debug, LogLevel.Debug },
+ { NHibernateLogLevel.Warn, LogLevel.Warning },
+ { NHibernateLogLevel.Error, LogLevel.Error },
+ { NHibernateLogLevel.Fatal, LogLevel.Critical },
+ { NHibernateLogLevel.None, LogLevel.None },
+ };
- public void Debug(object message, Exception exception)
+ public void Log(NHibernateLogLevel logLevel, NHibernateLogValues state, Exception exception)
{
- if (IsDebugEnabled)
- {
- _msLogger.LogDebug(exception, message.ToString());
- }
+ _msLogger.Log(MapLevels[logLevel], 0, new FormattedLogValues(state.Format, state.Args), exception, MessageFormatter);
}
- public void DebugFormat(string format, params object[] args)
+ public bool IsEnabled(NHibernateLogLevel logLevel)
{
- if (IsDebugEnabled)
- {
- _msLogger.LogDebug(format, args);
- }
+ return _msLogger.IsEnabled(MapLevels[logLevel]);
}
- public void Info(object message)
+ private static string MessageFormatter(object state, Exception error)
{
- if (IsInfoEnabled)
- {
- _msLogger.LogInformation(message.ToString());
- }
+ return state.ToString();
}
-
- public void Info(object message, Exception exception)
- {
- if (IsInfoEnabled)
- {
- _msLogger.LogInformation(exception, message.ToString());
- }
- }
-
- public void InfoFormat(string format, params object[] args)
- {
- if (IsInfoEnabled)
- {
- _msLogger.LogInformation(format, args);
- }
- }
-
- public void Warn(object message)
- {
- if (IsWarnEnabled)
- {
- _msLogger.LogWarning(message.ToString());
- }
- }
-
- public void Warn(object message, Exception exception)
- {
- if (IsWarnEnabled)
- {
- _msLogger.LogWarning(exception, message.ToString());
- }
- }
-
- public void WarnFormat(string format, params object[] args)
- {
- if (IsWarnEnabled)
- {
- _msLogger.LogWarning(format, args);
- }
- }
-
- public bool IsErrorEnabled => _msLogger.IsEnabled(LogLevel.Error);
- public bool IsFatalEnabled => _msLogger.IsEnabled(LogLevel.Critical);
- public bool IsDebugEnabled => _msLogger.IsEnabled(LogLevel.Debug);
- public bool IsInfoEnabled => _msLogger.IsEnabled(LogLevel.Information);
- public bool IsWarnEnabled => _msLogger.IsEnabled(LogLevel.Warning);
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLoggerFactory.cs b/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLoggerFactory.cs
index e6293ca5624..0e732127cd4 100644
--- a/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLoggerFactory.cs
+++ b/src/NHibernate.Example.Web/Infrastructure/NHibernateToMicrosoftLoggerFactory.cs
@@ -2,7 +2,7 @@
namespace NHibernate.Example.Web.Infrastructure
{
- public class NHibernateToMicrosoftLoggerFactory : NHibernate.ILoggerFactory
+ public class NHibernateToMicrosoftLoggerFactory : INHibernateLoggerFactory
{
private readonly Microsoft.Extensions.Logging.ILoggerFactory _loggerFactory;
@@ -11,16 +11,16 @@ public NHibernateToMicrosoftLoggerFactory(Microsoft.Extensions.Logging.ILoggerFa
_loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
}
- public IInternalLogger LoggerFor(string keyName)
+ public INHibernateLogger LoggerFor(string keyName)
{
var msLogger = _loggerFactory.CreateLogger(keyName);
return new NHibernateToMicrosoftLogger(msLogger);
}
- public IInternalLogger LoggerFor(System.Type type)
+ public INHibernateLogger LoggerFor(System.Type type)
{
return LoggerFor(
Microsoft.Extensions.Logging.Abstractions.Internal.TypeNameHelper.GetTypeDisplayName(type));
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj b/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj
index 31a677cf481..72eaca60cb2 100644
--- a/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj
+++ b/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj
@@ -14,6 +14,8 @@
+
+
diff --git a/src/NHibernate.Example.Web/Program.cs b/src/NHibernate.Example.Web/Program.cs
index f3bbe60d2e4..bf57dbb80fe 100644
--- a/src/NHibernate.Example.Web/Program.cs
+++ b/src/NHibernate.Example.Web/Program.cs
@@ -7,6 +7,8 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
+using Serilog;
+using Serilog.Events;
namespace NHibernate.Example.Web
{
@@ -14,12 +16,20 @@ public class Program
{
public static void Main(string[] args)
{
+ Log.Logger = new LoggerConfiguration()
+ .MinimumLevel.Debug()
+ .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
+ .Enrich.FromLogContext()
+ .WriteTo.Console()
+ .CreateLogger();
+
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
+ .UseSerilog()
.Build();
}
}
diff --git a/src/NHibernate.Test.VisualBasic/Issues/GH1468/Entity.vb b/src/NHibernate.Test.VisualBasic/Issues/GH1468/Entity.vb
new file mode 100644
index 00000000000..6d537e9ae36
--- /dev/null
+++ b/src/NHibernate.Test.VisualBasic/Issues/GH1468/Entity.vb
@@ -0,0 +1,7 @@
+Namespace Issues.GH1468
+ Public Class Entity
+ Public Overridable Property Id As Guid
+
+ Public Overridable Property Date1 As Date?
+ End Class
+End Namespace
diff --git a/src/NHibernate.Test.VisualBasic/Issues/GH1468/Fixture.vb b/src/NHibernate.Test.VisualBasic/Issues/GH1468/Fixture.vb
new file mode 100644
index 00000000000..91458176244
--- /dev/null
+++ b/src/NHibernate.Test.VisualBasic/Issues/GH1468/Fixture.vb
@@ -0,0 +1,81 @@
+Imports NUnit.Framework
+
+Namespace Issues.GH1468
+
+ Public Class Fixture
+ Inherits IssueTestCase
+
+ Protected Overrides Sub OnSetUp()
+
+ Using session As ISession = OpenSession()
+
+ Using transaction As ITransaction = session.BeginTransaction()
+
+ Dim e1 = New Entity
+ e1.Date1 = new Date(2017, 12, 3)
+ session.Save(e1)
+
+ Dim e2 = New Entity
+ e2.Date1 = new Date(2017, 12, 1)
+ session.Save(e2)
+
+ Dim e3 = New Entity
+ session.Save(e3)
+
+ session.Flush()
+ transaction.Commit()
+
+ End Using
+
+ End Using
+ End Sub
+
+ Protected Overrides Sub OnTearDown()
+
+ Using session As ISession = OpenSession()
+
+ Using transaction As ITransaction = session.BeginTransaction()
+
+ session.Delete("from System.Object")
+
+ session.Flush()
+ transaction.Commit()
+
+ End Using
+
+ End Using
+ End Sub
+
+
+ Public Sub ShouldBeAbleToCompareNullableDate()
+
+ Using session As ISession = OpenSession()
+ Using session.BeginTransaction()
+
+ Dim d = New Date(2017, 12, 2)
+ Dim result = (From e In session.Query (Of Entity)
+ Where e.Date1 >= d
+ Select e).ToList()
+
+ Assert.AreEqual(1, result.Count)
+ End Using
+ End Using
+ End Sub
+
+
+ Public Sub ShouldBeAbleToCompareNullableDateGetValueOrDefault()
+
+ Using session As ISession = OpenSession()
+ Using session.BeginTransaction()
+
+ Dim d = New Date(2017, 12, 2)
+ Dim result = (From e In session.Query (Of Entity)
+ Where (e.Date1 >= d).GetValueOrDefault()
+ Select e).ToList()
+
+ Assert.AreEqual(1, result.Count)
+ End Using
+ End Using
+ End Sub
+ End Class
+End Namespace
diff --git a/src/NHibernate.Test.VisualBasic/Issues/GH1468/Issues.GH1468.Mappings.hbm.xml b/src/NHibernate.Test.VisualBasic/Issues/GH1468/Issues.GH1468.Mappings.hbm.xml
new file mode 100644
index 00000000000..2199c157ea4
--- /dev/null
+++ b/src/NHibernate.Test.VisualBasic/Issues/GH1468/Issues.GH1468.Mappings.hbm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate.Test/Async/Component/Basic/ComponentTest.cs b/src/NHibernate.Test/Async/Component/Basic/ComponentTest.cs
index 362bf474d27..74c9d174485 100644
--- a/src/NHibernate.Test/Async/Component/Basic/ComponentTest.cs
+++ b/src/NHibernate.Test/Async/Component/Basic/ComponentTest.cs
@@ -32,7 +32,7 @@ protected override string MappingsAssembly
protected override System.Collections.IList Mappings
{
- get { return new string[] { }; }
+ get { return Array.Empty(); }
}
protected override void Configure(Configuration configuration)
diff --git a/src/NHibernate.Test/Async/Criteria/DetachedCriteriaSerializable.cs b/src/NHibernate.Test/Async/Criteria/DetachedCriteriaSerializable.cs
index 10f9217e586..927b4d39192 100644
--- a/src/NHibernate.Test/Async/Criteria/DetachedCriteriaSerializable.cs
+++ b/src/NHibernate.Test/Async/Criteria/DetachedCriteriaSerializable.cs
@@ -185,4 +185,4 @@ public async Task ExecutableCriteriaAsync()
await (SerializeAndListAsync(dc));
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/DialectTest/DialectFixture.cs b/src/NHibernate.Test/Async/DialectTest/DialectFixture.cs
index e822ea63452..2fd3d53d33a 100644
--- a/src/NHibernate.Test/Async/DialectTest/DialectFixture.cs
+++ b/src/NHibernate.Test/Async/DialectTest/DialectFixture.cs
@@ -68,7 +68,7 @@ public async Task CurrentTimestampSelectionAsync()
using (var connection = await (sessions.ConnectionProvider.GetConnectionAsync(CancellationToken.None)))
{
- var statement = driver.GenerateCommand(CommandType.Text, new SqlString(dialect.CurrentTimestampSelectString), new SqlType[0]);
+ var statement = driver.GenerateCommand(CommandType.Text, new SqlString(dialect.CurrentTimestampSelectString), Array.Empty());
statement.Connection = connection;
using (var reader = await (statement.ExecuteReaderAsync()))
{
diff --git a/src/NHibernate.Test/Async/Events/PostEvents/PostUpdateFixture.cs b/src/NHibernate.Test/Async/Events/PostEvents/PostUpdateFixture.cs
index aa3487708a0..bcea4c154f0 100644
--- a/src/NHibernate.Test/Async/Events/PostEvents/PostUpdateFixture.cs
+++ b/src/NHibernate.Test/Async/Events/PostEvents/PostUpdateFixture.cs
@@ -8,6 +8,7 @@
//------------------------------------------------------------------------------
+using System;
using System.Collections;
using System.Collections.Generic;
using NHibernate.Event;
@@ -56,7 +57,7 @@ public async Task ImplicitFlushAsync()
}
await (DbCleanupAsync());
- ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[0];
+ ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = Array.Empty();
}
[Test]
@@ -85,7 +86,7 @@ public async Task ExplicitUpdateAsync()
}
await (DbCleanupAsync());
- ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[0];
+ ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = Array.Empty();
}
[Test]
@@ -123,7 +124,7 @@ public async Task WithDetachedObjectAsync()
}
await (DbCleanupAsync());
- ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[0];
+ ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = Array.Empty();
}
[Test]
@@ -163,7 +164,7 @@ public async Task UpdateDetachedObjectAsync()
}
await (DbCleanupAsync());
- ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[0];
+ ((DebugSessionFactory) Sfi).EventListeners.PostUpdateEventListeners = Array.Empty();
}
[Test]
@@ -202,7 +203,7 @@ public async Task UpdateDetachedObjectWithLockAsync()
}
await (DbCleanupAsync());
- ((DebugSessionFactory)Sfi).EventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[0];
+ ((DebugSessionFactory)Sfi).EventListeners.PostUpdateEventListeners = Array.Empty();
}
private async Task DbCleanupAsync(CancellationToken cancellationToken = default(CancellationToken))
{
diff --git a/src/NHibernate.Test/Async/ExceptionsTest/NullQueryTest.cs b/src/NHibernate.Test/Async/ExceptionsTest/NullQueryTest.cs
index 8cd47a15452..5fa295ef6f1 100644
--- a/src/NHibernate.Test/Async/ExceptionsTest/NullQueryTest.cs
+++ b/src/NHibernate.Test/Async/ExceptionsTest/NullQueryTest.cs
@@ -28,7 +28,7 @@ public class NullQueryTestAsync : TestCase
protected override IList Mappings
{
- get { return new string[0]; }
+ get { return Array.Empty(); }
}
#endregion
diff --git a/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs b/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs
index d1075716ed2..3a0c9a92244 100644
--- a/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs
+++ b/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs
@@ -33,7 +33,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
protected HQLQueryPlan CreateQueryPlan(string hql, bool scalar)
{
- return new QueryExpressionPlan(new StringQueryExpression(hql), scalar, new CollectionHelper.EmptyMapClass(), Sfi);
+ return new QueryExpressionPlan(new StringQueryExpression(hql), scalar, CollectionHelper.EmptyDictionary(), Sfi);
}
protected HQLQueryPlan CreateQueryPlan(string hql)
diff --git a/src/NHibernate.Test/Async/Legacy/FumTest.cs b/src/NHibernate.Test/Async/Legacy/FumTest.cs
index 9c94d2a8d81..779c374d42d 100644
--- a/src/NHibernate.Test/Async/Legacy/FumTest.cs
+++ b/src/NHibernate.Test/Async/Legacy/FumTest.cs
@@ -86,7 +86,7 @@ public async Task CriteriaCollectionAsync()
Assert.IsTrue(b.MapComponent.Stringmap.Count == 2);
int none = (await (s.CreateCriteria(typeof(Fum))
- .Add(Expression.In("FumString", new string[0]))
+ .Add(Expression.In("FumString", Array.Empty()))
.ListAsync())).Count;
Assert.AreEqual(0, none);
diff --git a/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs b/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs
index 37f5b248623..dd131a898f4 100644
--- a/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs
+++ b/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs
@@ -25,7 +25,7 @@ namespace NHibernate.Test.LinqBulkManipulation
[TestFixture]
public class FixtureAsync : TestCase
{
- protected override IList Mappings => new string[0];
+ protected override IList Mappings => Array.Empty();
protected override void Configure(Cfg.Configuration configuration)
{
@@ -970,7 +970,7 @@ public async Task SimpleDeleteOnAnimalAsync()
using (var t = s.BeginTransaction())
{
// Get rid of FK which may fail the test
- _doll.Friends = new Human[0];
+ _doll.Friends = Array.Empty();
await (s.UpdateAsync(_doll));
await (t.CommitAsync());
}
@@ -1029,7 +1029,7 @@ public async Task DeleteOnJoinedSubclassAsync()
using (var t = s.BeginTransaction())
{
// Get rid of FK which may fail the test
- _doll.Friends = new Human[0];
+ _doll.Friends = Array.Empty();
await (s.UpdateAsync(_doll));
await (t.CommitAsync());
}
diff --git a/src/NHibernate.Test/Async/MappingByCode/IntegrationTests/NH2825/FixtureByCode.cs b/src/NHibernate.Test/Async/MappingByCode/IntegrationTests/NH2825/FixtureByCode.cs
index 56967846d45..e4ef7e134a2 100644
--- a/src/NHibernate.Test/Async/MappingByCode/IntegrationTests/NH2825/FixtureByCode.cs
+++ b/src/NHibernate.Test/Async/MappingByCode/IntegrationTests/NH2825/FixtureByCode.cs
@@ -8,6 +8,7 @@
//------------------------------------------------------------------------------
+using System;
using System.Collections;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping.ByCode;
@@ -21,7 +22,7 @@ public class FixtureByCodeAsync : FixtureAsync
{
protected override IList Mappings
{
- get { return new string[0]; }
+ get { return Array.Empty(); }
}
protected override string MappingsAssembly
@@ -63,4 +64,4 @@ private HbmMapping GetMappings()
return mapper.CompileMappingForAllExplicitlyAddedEntities();
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/CriteriaFromHql/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/CriteriaFromHql/Fixture.cs
index f19fce7514b..4064356a623 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/CriteriaFromHql/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/CriteriaFromHql/Fixture.cs
@@ -48,7 +48,7 @@ join fetch c.Children gc
where p.Parent is null")
.UniqueResultAsync());
- string hqlQuery = spy.Appender.GetEvents()[0].MessageObject.ToString();
+ string hqlQuery = spy.Appender.GetEvents()[0].RenderedMessage;
Debug.WriteLine("HQL: " + hqlQuery);
Assertions(result);
}
@@ -62,7 +62,7 @@ join fetch c.Children gc
.SetFetchMode("Children", FetchMode.Join)
.SetFetchMode("Children.Children", FetchMode.Join)
.UniqueResultAsync());
- string criteriaQuery = spy.Appender.GetEvents()[0].MessageObject.ToString();
+ string criteriaQuery = spy.Appender.GetEvents()[0].RenderedMessage;
Debug.WriteLine("Criteria: " + criteriaQuery);
Assertions(result);
}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/EmptyMappingsFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/EmptyMappingsFixture.cs
index 556893083c5..97fcfe57f9f 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/EmptyMappingsFixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/EmptyMappingsFixture.cs
@@ -29,7 +29,7 @@ public class EmptyMappingsFixtureAsync : TestCase
{
protected override IList Mappings
{
- get { return new string[0]; }
+ get { return Array.Empty(); }
}
[Test]
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH1486/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH1486/Fixture.cs
new file mode 100644
index 00000000000..69b6e469b6a
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH1486/Fixture.cs
@@ -0,0 +1,157 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by AsyncGenerator.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+
+using System.Linq;
+using NUnit.Framework;
+using NHibernate.Cfg;
+using NHibernate.Type;
+
+namespace NHibernate.Test.NHSpecificTest.GH1486
+{
+ using System.Threading.Tasks;
+ using System.Threading;
+ [TestFixture]
+ public class FixtureAsync : BugTestCase
+ {
+ private readonly OnFlushDirtyInterceptor _interceptor = new OnFlushDirtyInterceptor();
+
+ protected override void Configure(Configuration configuration)
+ {
+ base.Configure(configuration);
+ configuration.SetInterceptor(_interceptor);
+ }
+
+ protected override void OnSetUp()
+ {
+ using (var session = OpenSession())
+ {
+ using (var transaction = session.BeginTransaction())
+ {
+ var john = new Person(1, "John", new Address());
+ session.Save(john);
+
+ var mary = new Person(2, "Mary", null);
+ session.Save(mary);
+
+ var bob = new Person(3, "Bob", new Address("1", "A", "B"));
+ session.Save(bob);
+
+ session.Flush();
+ transaction.Commit();
+ }
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ session.Delete("from System.Object");
+ session.Flush();
+ transaction.Commit();
+ }
+ }
+
+ ///
+ /// The test case was imported from Hibernate HHH-11237 and adjusted for NHibernate.
+ ///
+ [Test]
+ public async Task TestSelectBeforeUpdateAsync()
+ {
+ using (var session = OpenSession())
+ {
+ using (var transaction = session.BeginTransaction())
+ {
+ var john = await (session.GetAsync(1));
+ _interceptor.Reset();
+ john.Address = null;
+ await (session.FlushAsync());
+ Assert.That(_interceptor.CallCount, Is.EqualTo(0), "unexpected flush dirty count for John");
+
+ _interceptor.Reset();
+ var mary = await (session.GetAsync(2));
+ mary.Address = new Address();
+ await (session.FlushAsync());
+ Assert.That(_interceptor.CallCount, Is.EqualTo(0), "unexpected flush dirty count for Mary");
+ await (transaction.CommitAsync());
+ }
+ }
+
+ Person johnObj;
+ Person maryObj;
+ using (var session = OpenSession())
+ {
+ using (var transaction = session.BeginTransaction())
+ {
+ johnObj = await (session.GetAsync(1));
+ }
+ }
+
+ using (var session = OpenSession())
+ {
+ using (var transaction = session.BeginTransaction())
+ {
+ maryObj = await (session.GetAsync(2));
+ }
+ }
+
+ using (var session = OpenSession())
+ {
+ using (var transaction = session.BeginTransaction())
+ {
+ _interceptor.Reset();
+ johnObj.Address = null;
+ await (session.UpdateAsync(johnObj));
+ await (session.FlushAsync());
+ Assert.That(_interceptor.CallCount, Is.EqualTo(0), "unexpected flush dirty count for John update");
+
+ _interceptor.Reset();
+ maryObj.Address = new Address();
+ await (session.UpdateAsync(maryObj));
+ await (session.FlushAsync());
+ Assert.That(_interceptor.CallCount, Is.EqualTo(0), "unexpected flush dirty count for Mary update");
+ await (transaction.CommitAsync());
+ }
+ }
+ }
+
+ [Test]
+ public async Task TestDirectCallToIsModifiedAsync()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ var person = await (session.LoadAsync(3));
+ Assert.That(person, Is.Not.Null, "Bob is not found.");
+ Assert.That(person.Address, Is.Not.Null, "Bob's address is missing.");
+ var sessionImplementor = session.GetSessionImplementation();
+
+ var metaData = session.SessionFactory.GetClassMetadata(typeof(Person));
+ foreach (var propertyType in metaData.PropertyTypes)
+ {
+ if (!(propertyType is ComponentType componentType) || componentType.ReturnedClass.Name != "Address")
+ continue;
+
+ var checkable = new [] { true, true, true };
+ Assert.That(
+ () => componentType.IsModifiedAsync(new object[] { "", "", "" }, person.Address, checkable, sessionImplementor, CancellationToken.None),
+ Throws.Nothing,
+ "Checking component against an array snapshot failed");
+ var isModified = await (componentType.IsModifiedAsync(person.Address, person.Address, checkable, sessionImplementor, CancellationToken.None));
+ Assert.That(isModified, Is.False, "Checking same component failed");
+ isModified = await (componentType.IsModifiedAsync(new Address("1", "A", "B"), person.Address, checkable, sessionImplementor, CancellationToken.None));
+ Assert.That(isModified, Is.False, "Checking equal component failed");
+ }
+ await (transaction.RollbackAsync());
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs
index 1a9cdefceac..71ada7ac57e 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs
@@ -156,7 +156,8 @@ public async Task WillGetSessionIdFromSessionLogsConcurrentAsync()
var sessionIds = new ConcurrentDictionary();
using (var spy = new TextLogSpy("NHibernate.SQL", "%message | SessionId: %property{sessionId}"))
{
- await (Task.WhenAll(Enumerable.Range( 1, 12).Select( async i =>
+ await (Task.WhenAll(
+ Enumerable.Range(1, 12 - 1).Select(async i =>
{
if (i > 10)
{
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs
index 1e7ecd3c116..1e8dc255183 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs
@@ -64,7 +64,7 @@ public async Task CanSaveInSingleBatchAsync()
await (tx.CommitAsync());
foreach (LoggingEvent loggingEvent in spy.Appender.GetEvents())
{
- if ("Executing batch".Equals(loggingEvent.MessageObject))
+ if ("Executing batch".Equals(loggingEvent.RenderedMessage))
{
executedBatch = true;
break;
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1347/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1347/Fixture.cs
index b7994c7cb68..44942d103fa 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH1347/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1347/Fixture.cs
@@ -49,7 +49,7 @@ public async Task BugAsync()
.UniqueResultAsync());
Assert.AreEqual("1", a.Name);
Assert.IsTrue(
- spy.Appender.GetEvents()[0].MessageObject.ToString().Contains("limit")
+ spy.Appender.GetEvents()[0].RenderedMessage.Contains("limit")
);
}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1421/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1421/Fixture.cs
index 930a266889a..5650f0bc2df 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH1421/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1421/Fixture.cs
@@ -27,7 +27,7 @@ public void WhenParameterListIsEmptyUsingQueryThenDoesNotTrowsNullReferenceExcep
using (var s = OpenSession())
{
var query = s.CreateQuery("from AnEntity a where a.id in (:myList)");
- Assert.That(() => query.SetParameterList("myList", new long[0]).ListAsync(), Throws.Exception.Not.InstanceOf());
+ Assert.That(() => query.SetParameterList("myList", Array.Empty()).ListAsync(), Throws.Exception.Not.InstanceOf());
}
}
}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2166/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2166/Fixture.cs
index 3e923eb932c..ce2818d7c47 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2166/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2166/Fixture.cs
@@ -21,7 +21,7 @@ public class FixtureAsync: TestCase
{
protected override IList Mappings
{
- get { return new string[0]; }
+ get { return Array.Empty(); }
}
[Test]
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs
index 0a9a7a3c4df..c8aedc6450f 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs
@@ -127,7 +127,7 @@ where personIds.Contains(person.Id)
var softReferenceCache = (IEnumerable) field.GetValue(cache);
// Since the cache only contains one item, the first one will be our key
- var queryPlanCacheKey = ((DictionaryEntry) softReferenceCache.First()).Key;
+ var queryPlanCacheKey = ((DictionaryEntry) softReferenceCache.Cast