diff --git a/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3657/OneToOneToPropertyReferenceWithExplicitClassSet.cs b/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3657/OneToOneToPropertyReferenceWithExplicitClassSet.cs new file mode 100644 index 00000000000..e759fbb91de --- /dev/null +++ b/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3657/OneToOneToPropertyReferenceWithExplicitClassSet.cs @@ -0,0 +1,101 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Linq; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using NHibernate.Test.MappingByCode.IntegrationTests.NH3041; + +namespace NHibernate.Test.MappingByCode.IntegrationTests.NH3657 +{ + [TestFixture] + public class OneToOneToPropertyReferenceWithExplicitClassSet : TestCaseMappingByCode + { + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var person1 = new Person { FirstName = "Jack" }; + session.Save(person1); + + var person2 = new Person { FirstName = "Robert" }; + session.Save(person2); + + var personDetail = new PersonDetail { LastName = "Smith", Person = person1 }; + session.Save(personDetail); + + tx.Commit(); + } + } + + protected override void OnTearDown() + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + session.Delete("from System.Object"); + tx.Commit(); + } + } + + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class(m => + { + m.Id(t => t.PersonDetailId, a => a.Generator(Generators.Identity)); + m.Property(t => t.LastName, + c => + { + c.NotNullable(true); + c.Length(32); + }); + m.ManyToOne(t => t.Person, + c => + { + c.Column("PersonId"); + c.Unique(true); + c.NotNullable(false); + c.NotFound(NotFoundMode.Ignore); + }); + }); + + mapper.Class(m => + { + m.Id(t => t.PersonId, a => a.Generator(Generators.Identity)); + m.Property(t => t.FirstName, + c => + { + c.NotNullable(true); + c.Length(32); + }); + m.OneToOne(t => t.PersonDetail, + oo => + { + //NH-3657 + oo.Class(typeof(PersonDetail)); + oo.PropertyReference(x => x.Person); + oo.Cascade(Mapping.ByCode.Cascade.All); + }); + }); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + + [Test] + public void ShouldConfigureSessionCorrectly() + { + using (var session = OpenSession()) + { + var person1 = session.Get(1); + var person2 = session.Get(2); + var personDetail = session.Query().Single(); + + Assert.IsNull(person2.PersonDetail); + Assert.IsNotNull(person1.PersonDetail); + Assert.AreEqual(person1.PersonDetail.LastName, personDetail.LastName); + Assert.AreEqual(person1.FirstName, personDetail.Person.FirstName); + } + } + } +} diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index a8d325494c7..eca05f3f59c 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -592,6 +592,7 @@ + @@ -3630,4 +3631,4 @@ if exist hibernate.cfg.xml (del hibernate.cfg.xml) if exist "$(ProjectDir)hibernate.cfg.xml" (copy "$(ProjectDir)hibernate.cfg.xml" "hibernate.cfg.xml") copy /y "..\..\..\NHibernate.DomainModel\ABC.hbm.xml" "ABC.hbm.xml" - + \ No newline at end of file diff --git a/src/NHibernate/Mapping/ByCode/IOneToOneMapper.cs b/src/NHibernate/Mapping/ByCode/IOneToOneMapper.cs index dc9561da2d3..52ff1ff3dd2 100644 --- a/src/NHibernate/Mapping/ByCode/IOneToOneMapper.cs +++ b/src/NHibernate/Mapping/ByCode/IOneToOneMapper.cs @@ -12,6 +12,7 @@ public interface IOneToOneMapper : IEntityPropertyMapper void PropertyReference(MemberInfo propertyInTheOtherSide); void Formula(string formula); void ForeignKey(string foreignKeyName); + void Class(System.Type clazz); } public interface IOneToOneMapper : IOneToOneMapper diff --git a/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs index 11638b4e067..66264449fe2 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs @@ -32,6 +32,11 @@ public void Cascade(Cascade cascadeStyle) _oneToOne.cascade = (cascadeStyle.Exclude(ByCode.Cascade.DeleteOrphans)).ToCascadeString(); } + public void Class(System.Type clazz) + { + _oneToOne.@class = clazz.FullName; + } + #endregion #region Implementation of IAccessorPropertyMapper