From 15bde0a97db65e9bcbdcf9c679804183bd21d8c6 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 16 Jun 2023 10:18:45 +0300 Subject: [PATCH 01/10] Test case --- .../NHSpecificTest/GH3289/FixtureByCode.cs | 79 +++++++++++++++++++ .../NHSpecificTest/GH3289/Models.cs | 31 ++++++++ 2 files changed, 110 insertions(+) create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs diff --git a/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs new file mode 100644 index 00000000000..6d61f8c9d1d --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs @@ -0,0 +1,79 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Linq; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3289 +{ + [TestFixture] + public class ByCodeFixture : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class(rc => + { + rc.Id(x => x.Id, m => m.Generator(Generators.Identity)); + rc.Property(x => x.Name); + rc.Component(x => x.Component); + }); + mapper.JoinedSubclass(rc => + { + rc.EntityName(typeof(ISubEntity).FullName); + rc.Key(k => k.Column("Id")); + rc.Property(x => x.SomeProperty); + }); + mapper.Component(rc => + { + rc.Property(x => x.Field); + rc.Lazy(true); + }); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var e1 = new SubEntity { Name = "Jim" }; + session.Save(e1); + + transaction.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public void TestSubEntityInterfaceWithFetchIsPropertyInitialized() + { + using var session = OpenSession(); + var data = session.Query() + .Fetch(e => e.Component) + .ToList(); + var result = NHibernateUtil.IsPropertyInitialized(data[0], "Component"); + + Assert.That(result, Is.True); + } + + [Test] + public void TestSubEntityWithFetchIsPropertyInitialized() + { + using var session = OpenSession(); + var data = session.Query() + .Fetch(e => e.Component) + .ToList(); + var result = NHibernateUtil.IsPropertyInitialized(data[0], "Component"); + + Assert.That(result, Is.True); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs b/src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs new file mode 100644 index 00000000000..68c8385e0a3 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs @@ -0,0 +1,31 @@ +namespace NHibernate.Test.NHSpecificTest.GH3289 +{ + public interface IEntity + { + int Id { get; set; } + string Name { get; set; } + Component Component { get; set; } + } + + public interface ISubEntity : IEntity + { + public bool SomeProperty { get; set; } + } + + public class Entity : IEntity + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual Component Component { get; set; } + } + + public class SubEntity : Entity, ISubEntity + { + public virtual bool SomeProperty { get; set; } + } + + public class Component + { + public virtual string Field { get; set; } + } +} From 8bae384a54b6a88c5568b3e06e24b541b307f690 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 Jun 2023 07:25:19 +0000 Subject: [PATCH 02/10] Generate async files --- .../NHSpecificTest/GH3289/FixtureByCode.cs | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs new file mode 100644 index 00000000000..9d7fc6125d6 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs @@ -0,0 +1,90 @@ +//------------------------------------------------------------------------------ +// +// 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 NHibernate.Cfg.MappingSchema; +using NHibernate.Linq; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3289 +{ + using System.Threading.Tasks; + [TestFixture] + public class ByCodeFixtureAsync : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class(rc => + { + rc.Id(x => x.Id, m => m.Generator(Generators.Identity)); + rc.Property(x => x.Name); + rc.Component(x => x.Component); + }); + mapper.JoinedSubclass(rc => + { + rc.EntityName(typeof(ISubEntity).FullName); + rc.Key(k => k.Column("Id")); + rc.Property(x => x.SomeProperty); + }); + mapper.Component(rc => + { + rc.Property(x => x.Field); + rc.Lazy(true); + }); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var e1 = new SubEntity { Name = "Jim" }; + session.Save(e1); + + transaction.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public async Task TestSubEntityInterfaceWithFetchIsPropertyInitializedAsync() + { + using var session = OpenSession(); + var data = await (session.Query() + .Fetch(e => e.Component) + .ToListAsync()); + var result = NHibernateUtil.IsPropertyInitialized(data[0], "Component"); + + Assert.That(result, Is.True); + } + + [Test] + public async Task TestSubEntityWithFetchIsPropertyInitializedAsync() + { + using var session = OpenSession(); + var data = await (session.Query() + .Fetch(e => e.Component) + .ToListAsync()); + var result = NHibernateUtil.IsPropertyInitialized(data[0], "Component"); + + Assert.That(result, Is.True); + } + } +} From d3ad54f48828666d8714de6b80c821c4b1e8997d Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 16 Jun 2023 10:32:30 +0300 Subject: [PATCH 03/10] Fix --- .../Visitors/ResultOperatorProcessors/ProcessFetch.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs b/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs index a042af3c12d..2ac7b7152fc 100644 --- a/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs +++ b/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs @@ -52,6 +52,16 @@ private void Process( { var metadata = queryModelVisitor.VisitorParameters.SessionFactory .GetClassMetadata(resultOperator.RelationMember.ReflectedType); + if (metadata == null) + { + var entityName = queryModelVisitor.VisitorParameters.SessionFactory.GetImplementors( + resultOperator.RelationMember.ReflectedType.FullName).SingleOrDefault(); + if (!string.IsNullOrEmpty(entityName)) + { + metadata = queryModelVisitor.VisitorParameters.SessionFactory.GetClassMetadata(entityName); + } + } + propType = metadata?.GetPropertyType(resultOperator.RelationMember.Name); } From 5c5553299271d63b37b2ce933d6c98dc6bba6ee3 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 16 Jun 2023 13:20:21 +0300 Subject: [PATCH 04/10] Fix SqlServerCe --- src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs index 6d61f8c9d1d..0b2a8352072 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs @@ -47,7 +47,11 @@ protected override void OnTearDown() { using var session = OpenSession(); using var transaction = session.BeginTransaction(); - session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + if (Dialect.SupportsTemporaryTables) + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + else + session.Delete("from System.Object"); transaction.Commit(); } From 10770aa1d40aa0927fb61e684b25544233e80d7b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 Jun 2023 10:23:11 +0000 Subject: [PATCH 05/10] Generate async files --- .../Async/NHSpecificTest/GH3289/FixtureByCode.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs index 9d7fc6125d6..6d0b79f8b50 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs @@ -58,7 +58,11 @@ protected override void OnTearDown() { using var session = OpenSession(); using var transaction = session.BeginTransaction(); - session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + if (Dialect.SupportsTemporaryTables) + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + else + session.Delete("from System.Object"); transaction.Commit(); } From 5dad3daad83c6f17207732c5862d68b46a7defdc Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 17 Jun 2023 08:46:51 +0300 Subject: [PATCH 06/10] Add test case with multiple entities returned by interface --- .../NHSpecificTest/GH3289/FixtureByCode.cs | 20 ++++++- .../NHSpecificTest/GH3289/Models.cs | 56 ++++++++++--------- 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs index 0b2a8352072..d22bd9c98f9 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs @@ -18,9 +18,14 @@ protected override HbmMapping GetMappings() rc.Property(x => x.Name); rc.Component(x => x.Component); }); + mapper.Class(rc => + { + rc.Id(x => x.Id, m => m.Generator(Generators.Identity)); + rc.Property(x => x.Name); + rc.Component(x => x.Component); + }); mapper.JoinedSubclass(rc => { - rc.EntityName(typeof(ISubEntity).FullName); rc.Key(k => k.Column("Id")); rc.Property(x => x.SomeProperty); }); @@ -68,6 +73,19 @@ public void TestSubEntityInterfaceWithFetchIsPropertyInitialized() Assert.That(result, Is.True); } + [Test] + public void TestEntityInterfaceWithFetchIsPropertyInitialized() + { + using var log = new SqlLogSpy(); + using var session = OpenSession(); + var data = session.Query() + .Fetch(e => e.Component) + .ToList(); + var result = NHibernateUtil.IsPropertyInitialized(data[0], "Component"); + + Assert.That(result, Is.True); + } + [Test] public void TestSubEntityWithFetchIsPropertyInitialized() { diff --git a/src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs b/src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs index 68c8385e0a3..ffbbeeb7bf7 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH3289/Models.cs @@ -1,31 +1,37 @@ namespace NHibernate.Test.NHSpecificTest.GH3289 { - public interface IEntity - { - int Id { get; set; } - string Name { get; set; } - Component Component { get; set; } - } + public interface IEntity + { + int Id { get; set; } + string Name { get; set; } + Component Component { get; set; } + } - public interface ISubEntity : IEntity - { - public bool SomeProperty { get; set; } - } - - public class Entity : IEntity - { - public virtual int Id { get; set; } - public virtual string Name { get; set; } - public virtual Component Component { get; set; } - } + public interface ISubEntity : IEntity + { + public bool SomeProperty { get; set; } + } - public class SubEntity : Entity, ISubEntity - { - public virtual bool SomeProperty { get; set; } - } + public class Entity : IEntity + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual Component Component { get; set; } + } + public class OtherEntity : IEntity + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual Component Component { get; set; } + } - public class Component - { - public virtual string Field { get; set; } - } + public class SubEntity : Entity, ISubEntity + { + public virtual bool SomeProperty { get; set; } + } + + public class Component + { + public virtual string Field { get; set; } + } } From d0084ead15a69a334fb6fcbc3672ac2775d248a7 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 17 Jun 2023 08:48:10 +0300 Subject: [PATCH 07/10] Fix --- .../Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs b/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs index 2ac7b7152fc..31401f7df81 100644 --- a/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs +++ b/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFetch.cs @@ -55,7 +55,7 @@ private void Process( if (metadata == null) { var entityName = queryModelVisitor.VisitorParameters.SessionFactory.GetImplementors( - resultOperator.RelationMember.ReflectedType.FullName).SingleOrDefault(); + resultOperator.RelationMember.ReflectedType.FullName).FirstOrDefault(); if (!string.IsNullOrEmpty(entityName)) { metadata = queryModelVisitor.VisitorParameters.SessionFactory.GetClassMetadata(entityName); From c8e4e8332ba3d6f1818559ee9298287d6bb9b43e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 17 Jun 2023 05:52:36 +0000 Subject: [PATCH 08/10] Generate async files --- .../NHSpecificTest/GH3289/FixtureByCode.cs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs index 6d0b79f8b50..d991b30f5ca 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs @@ -29,9 +29,14 @@ protected override HbmMapping GetMappings() rc.Property(x => x.Name); rc.Component(x => x.Component); }); + mapper.Class(rc => + { + rc.Id(x => x.Id, m => m.Generator(Generators.Identity)); + rc.Property(x => x.Name); + rc.Component(x => x.Component); + }); mapper.JoinedSubclass(rc => { - rc.EntityName(typeof(ISubEntity).FullName); rc.Key(k => k.Column("Id")); rc.Property(x => x.SomeProperty); }); @@ -79,6 +84,19 @@ public async Task TestSubEntityInterfaceWithFetchIsPropertyInitializedAsync() Assert.That(result, Is.True); } + [Test] + public async Task TestEntityInterfaceWithFetchIsPropertyInitializedAsync() + { + using var log = new SqlLogSpy(); + using var session = OpenSession(); + var data = await (session.Query() + .Fetch(e => e.Component) + .ToListAsync()); + var result = NHibernateUtil.IsPropertyInitialized(data[0], "Component"); + + Assert.That(result, Is.True); + } + [Test] public async Task TestSubEntityWithFetchIsPropertyInitializedAsync() { From b389372b36665e227d5990372ceb45a8ece3aa47 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 17 Jun 2023 09:00:09 +0300 Subject: [PATCH 09/10] test clean up --- src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs index d22bd9c98f9..8bc20205c12 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH3289/FixtureByCode.cs @@ -76,7 +76,6 @@ public void TestSubEntityInterfaceWithFetchIsPropertyInitialized() [Test] public void TestEntityInterfaceWithFetchIsPropertyInitialized() { - using var log = new SqlLogSpy(); using var session = OpenSession(); var data = session.Query() .Fetch(e => e.Component) From af36c546c840f49f45bf391e260b8f0d3bf1873d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 17 Jun 2023 06:03:34 +0000 Subject: [PATCH 10/10] Generate async files --- src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs index d991b30f5ca..721d35848ab 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3289/FixtureByCode.cs @@ -87,7 +87,6 @@ public async Task TestSubEntityInterfaceWithFetchIsPropertyInitializedAsync() [Test] public async Task TestEntityInterfaceWithFetchIsPropertyInitializedAsync() { - using var log = new SqlLogSpy(); using var session = OpenSession(); var data = await (session.Query() .Fetch(e => e.Component)