From: <fab...@us...> - 2011-05-09 14:14:18
|
Revision: 5801 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5801&view=rev Author: fabiomaulo Date: 2011-05-09 14:14:11 +0000 (Mon, 09 May 2011) Log Message: ----------- Fix NH-2510 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs 2011-05-08 22:59:17 UTC (rev 5800) +++ trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs 2011-05-09 14:14:11 UTC (rev 5801) @@ -61,10 +61,17 @@ /// <returns></returns> public static object[] Assemble(object[] row, ICacheAssembler[] types, ISessionImplementor session, object owner) { - object[] assembled = new object[row.Length]; + var assembled = new object[row.Length]; for (int i = 0; i < row.Length; i++) { - assembled[i] = types[i].Assemble(row[i], session, owner); + if (row[i] == LazyPropertyInitializer.UnfetchedProperty || row[i] == BackrefPropertyAccessor.Unknown) + { + assembled[i] = row[i]; + } + else + { + assembled[i] = types[i].Assemble(row[i], session, owner); + } } return assembled; } @@ -110,10 +117,17 @@ public static object[] Replace(object[] original, object[] target, IType[] types, ISessionImplementor session, object owner, IDictionary copiedAlready) { - object[] copied = new object[original.Length]; + var copied = new object[original.Length]; for (int i = 0; i < original.Length; i++) { - copied[i] = types[i].Replace(original[i], target[i], session, owner, copiedAlready); + if (original[i] == LazyPropertyInitializer.UnfetchedProperty || original[i] == BackrefPropertyAccessor.Unknown) + { + copied[i] = target[i]; + } + else + { + copied[i] = types[i].Replace(original[i], target[i], session, owner, copiedAlready); + } } return copied; } @@ -225,7 +239,7 @@ for (int i = 0; i < span; i++) { bool dirty = - // TODO H3: x[ i ] != LazyPropertyInitializer.UnfetchedProperty && //x is the "current" state + currentState[i] != LazyPropertyInitializer.UnfetchedProperty && properties[i].IsDirtyCheckable(anyUninitializedProperties) && properties[i].Type.IsDirty(previousState[i], currentState[i], includeColumns[i], session); @@ -276,7 +290,7 @@ for (int i = 0; i < span; i++) { bool dirty = - // TODO H3: x[ i ] != LazyPropertyInitializer.UnfetchedProperty && //x is the "current" state + currentState[i] != LazyPropertyInitializer.UnfetchedProperty && properties[i].IsDirtyCheckable(anyUninitializedProperties) && properties[i].Type.IsModified(previousState[i], currentState[i], includeColumns[i], session); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs 2011-05-09 14:14:11 UTC (rev 5801) @@ -0,0 +1,77 @@ +using System; +using NHibernate.Cache; +using NHibernate.Cfg; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2510 +{ + public class Image + { + public virtual int Id { get; set; } + public virtual byte[] Data { get; set; } + } + public class Fixture: TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class<Image>(rc => + { + rc.Cache(map => map.Usage(CacheUsage.NonstrictReadWrite)); + rc.Id(x=> x.Id); + rc.Property(x => x.Data, map=> map.Lazy(true)); + }); + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + return mappings; + } + + protected override void Configure(Cfg.Configuration configuration) + { + configuration.Cache(x=> x.Provider<HashtableCacheProvider>()); + } + + private class Scenario: IDisposable + { + private readonly ISessionFactory factory; + + public Scenario(ISessionFactory factory) + { + this.factory = factory; + using (var session = factory.OpenSession()) + using (session.BeginTransaction()) + { + session.Persist(new Image { Id = 1 }); + session.Transaction.Commit(); + } + } + + public void Dispose() + { + using (var session = factory.OpenSession()) + using (session.BeginTransaction()) + { + session.CreateQuery("delete from Image").ExecuteUpdate(); + session.Transaction.Commit(); + } + } + } + + [Test] + public void WhenReadFromCacheThenDoesNotThrow() + { + using (new Scenario(Sfi)) + { + using (ISession s = OpenSession()) + { + var book = s.Get<Image>(1); + } + using (ISession s = OpenSession()) + { + var book = s.Get<Image>(1); + } + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-08 22:59:17 UTC (rev 5800) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 14:14:11 UTC (rev 5801) @@ -784,6 +784,7 @@ <Compile Include="NHSpecificTest\NH2505\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2507\Animal.cs" /> <Compile Include="NHSpecificTest\NH2507\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2510\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2527\FixtureWithNoBatcher.cs" /> <Compile Include="NHSpecificTest\NH2527\Model.cs" /> <Compile Include="NHSpecificTest\NH2530\Domain.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |