From 195305ef0799fe1620592e652cd6cb5c0725946c Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Fri, 2 Jun 2017 17:04:33 +1200 Subject: [PATCH 1/2] NH-3374 - Merge detached entity failed when the instrumented lazy property is initialized --- .../NHSpecificTest/NH3374/FixtureByCode.cs | 2 +- src/NHibernate/Type/TypeHelper.cs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs index 88bf0c1ab1d..0192c553004 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs @@ -6,7 +6,7 @@ namespace NHibernate.Test.NHSpecificTest.NH3374 { - [Ignore("Not fixed yet.")] + [TestFixture] public class ByCodeFixture : TestCaseMappingByCode { protected override HbmMapping GetMappings() diff --git a/src/NHibernate/Type/TypeHelper.cs b/src/NHibernate/Type/TypeHelper.cs index 8f750c48944..51f992f0993 100644 --- a/src/NHibernate/Type/TypeHelper.cs +++ b/src/NHibernate/Type/TypeHelper.cs @@ -126,6 +126,25 @@ public static object[] Replace(object[] original, object[] target, IType[] types { copied[i] = target[i]; } + else if (target[i] == LazyPropertyInitializer.UnfetchedProperty) + { + // Should be no need to check for target[i] == PropertyAccessStrategyBackRefImpl.UNKNOWN + // because PropertyAccessStrategyBackRefImpl.get( object ) returns + // PropertyAccessStrategyBackRefImpl.UNKNOWN, so target[i] == original[i]. + // + // We know from above that original[i] != LazyPropertyInitializer.UNFETCHED_PROPERTY && + // original[i] != PropertyAccessStrategyBackRefImpl.UNKNOWN; + // This is a case where the entity being merged has a lazy property + // that has been initialized. Copy the initialized value from original. + if (types[i].IsMutable) + { + copied[i] = types[i].DeepCopy(original[i], session.Factory); + } + else + { + copied[i] = original[i]; + } + } else { copied[i] = types[i].Replace(original[i], target[i], session, owner, copiedAlready); From cce34c2eb328b3dece58d0c7a790a273ca46a2e9 Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Fri, 2 Jun 2017 21:34:29 +1200 Subject: [PATCH 2/2] Fix mapping for SQLite and Postgres --- src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs index 0192c553004..188deb144e0 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3374/FixtureByCode.cs @@ -27,11 +27,7 @@ protected override HbmMapping GetMappings() map.Id(x => x.Id, idMapper => idMapper.Generator(Generators.Identity)); map.Property(x => x.Bytes, y => { - y.Column(x => - { - x.SqlType("varbinary(max)"); - x.Length(int.MaxValue); - }); + y.Length(int.MaxValue); y.Lazy(true); }); });