From a6e514cdfdd130aea7cc54a5294c6aa55246889f Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Mon, 15 Feb 2021 13:11:31 +0200 Subject: [PATCH 1/2] Fix property-ref on joined subclass --- .../Async/NHSpecificTest/NH1040/Fixture.cs | 91 +++++++++++++++++++ .../NHSpecificTest/NH1040/Entity.cs | 19 ++++ .../NHSpecificTest/NH1040/Fixture.cs | 80 ++++++++++++++++ .../NHSpecificTest/NH1040/Mappings.hbm.xml | 24 +++++ src/NHibernate/Mapping/JoinedSubclass.cs | 5 - 5 files changed, 214 insertions(+), 5 deletions(-) create mode 100644 src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/NH1040/Entity.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/NH1040/Mappings.hbm.xml diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs new file mode 100644 index 00000000000..bab165e827f --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs @@ -0,0 +1,91 @@ +//------------------------------------------------------------------------------ +// +// 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.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1040 +{ + using System.Threading.Tasks; + [TestFixture] + public class SubclassPropertyRefFixtureAsync : BugTestCase + { + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var child = new Child(); + session.Save(child); + + var consumer = new Consumer(); + session.Save(consumer); + child.UK = consumer.Id; + consumer.Child = child; + + 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 CanLazyLoadAsync() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = await ((from e in session.Query() + select e).FirstAsync()); + + Assert.That(result.Child, Is.Not.Null); + Assert.DoesNotThrowAsync(() => NHibernateUtil.InitializeAsync(result.Child)); + } + } + + [Test] + public async Task CanLinqFetchAsync() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = await ((from e in session.Query().Fetch(x => x.Child) + select e).FirstAsync()); + + Assert.That(result.Child, Is.Not.Null); + Assert.That(NHibernateUtil.IsInitialized(result.Child), Is.True); + } + } + + [Test] + public async Task CanQueryOverFetchAsync() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = await ((from e in session.Query().Fetch(x => x.Child) + select e).FirstAsync()); + + Assert.That(result.Child, Is.Not.Null); + Assert.That(NHibernateUtil.IsInitialized(result.Child), Is.True); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1040/Entity.cs b/src/NHibernate.Test/NHSpecificTest/NH1040/Entity.cs new file mode 100644 index 00000000000..649c408b336 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/NH1040/Entity.cs @@ -0,0 +1,19 @@ +namespace NHibernate.Test.NHSpecificTest.NH1040 +{ + class Parent + { + public virtual int Id { get; set; } + public virtual int UK { get; set; } + } + + class Child : Parent + { + public virtual string Name { get; set; } + } + + class Consumer + { + public virtual int Id { get; set; } + public virtual Child Child { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs new file mode 100644 index 00000000000..b513d866015 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs @@ -0,0 +1,80 @@ +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1040 +{ + [TestFixture] + public class SubclassPropertyRefFixture : BugTestCase + { + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var child = new Child(); + session.Save(child); + + var consumer = new Consumer(); + session.Save(consumer); + child.UK = consumer.Id; + consumer.Child = child; + + 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 CanLazyLoad() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = (from e in session.Query() + select e).First(); + + Assert.That(result.Child, Is.Not.Null); + Assert.DoesNotThrow(() => NHibernateUtil.Initialize(result.Child)); + } + } + + [Test] + public void CanLinqFetch() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = (from e in session.Query().Fetch(x => x.Child) + select e).First(); + + Assert.That(result.Child, Is.Not.Null); + Assert.That(NHibernateUtil.IsInitialized(result.Child), Is.True); + } + } + + [Test] + public void CanQueryOverFetch() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = (from e in session.Query().Fetch(x => x.Child) + select e).First(); + + Assert.That(result.Child, Is.Not.Null); + Assert.That(NHibernateUtil.IsInitialized(result.Child), Is.True); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1040/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/NH1040/Mappings.hbm.xml new file mode 100644 index 00000000000..c64e5b451fb --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/NH1040/Mappings.hbm.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/NHibernate/Mapping/JoinedSubclass.cs b/src/NHibernate/Mapping/JoinedSubclass.cs index f7177d10e0d..efde2ee7fb8 100644 --- a/src/NHibernate/Mapping/JoinedSubclass.cs +++ b/src/NHibernate/Mapping/JoinedSubclass.cs @@ -41,10 +41,5 @@ public override void Validate(IMapping mapping) throw new MappingException(string.Format("subclass key has wrong number of columns: {0} type: {1}", MappedClass.Name, Key.Type.Name)); } } - - public override IEnumerable ReferenceablePropertyIterator - { - get { return PropertyIterator; } - } } } From 7ac1960fba47b648c2c55c342cfa2f70442b27ea Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 17 Feb 2021 19:14:19 +0200 Subject: [PATCH 2/2] Fix SqlServerCe tests --- src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs | 2 +- src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs index bab165e827f..be515057de6 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1040/Fixture.cs @@ -40,7 +40,7 @@ protected override void OnTearDown() using (var session = OpenSession()) using (var transaction = session.BeginTransaction()) { - session.CreateQuery("delete from System.Object").ExecuteUpdate(); + session.Delete("from System.Object"); transaction.Commit(); } diff --git a/src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs index b513d866015..8a320a139a8 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1040/Fixture.cs @@ -29,7 +29,7 @@ protected override void OnTearDown() using (var session = OpenSession()) using (var transaction = session.BeginTransaction()) { - session.CreateQuery("delete from System.Object").ExecuteUpdate(); + session.Delete("from System.Object"); transaction.Commit(); }