Skip to content

Commit ad35d6b

Browse files
committed
NH-3280 - Port-back fix for PropertyReference in IOneToOneMapper for inherited properties
1 parent e6cd5a9 commit ad35d6b

File tree

4 files changed

+134
-3
lines changed

4 files changed

+134
-3
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace NHibernate.Test.MappingByCode.IntegrationTests.NH3280
2+
{
3+
public class PersonDetail : PersonDetailBase
4+
{
5+
//public override Person Person { get; set; }
6+
}
7+
8+
public class PersonDetailBase
9+
{
10+
public virtual string LastName { get; set; }
11+
public virtual Person Person { get; set; }
12+
public virtual int? PersonDetailId { get; set; }
13+
}
14+
15+
public class Person : PersonBase
16+
{
17+
}
18+
19+
public class PersonBase
20+
{
21+
public virtual string FirstName { get; set; }
22+
public virtual PersonDetail PersonDetail { get; set; }
23+
public virtual int? PersonId { get; set; }
24+
}
25+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
using NHibernate.Cfg.MappingSchema;
2+
using NHibernate.Mapping.ByCode;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.MappingByCode.IntegrationTests.NH3280
6+
{
7+
[TestFixture]
8+
public class OneToOneToInheritedProperty : TestCaseMappingByCode
9+
{
10+
private int _person1Id;
11+
private int _person2Id;
12+
private int _personDetailId;
13+
14+
protected override void OnSetUp()
15+
{
16+
using (var session = OpenSession())
17+
using (var tx = session.BeginTransaction())
18+
{
19+
var person1 = new Person { FirstName = "Jack" };
20+
_person1Id = (int)session.Save(person1);
21+
22+
var person2 = new Person { FirstName = "Robert" };
23+
_person2Id = (int)session.Save(person2);
24+
25+
var personDetail = new PersonDetail { LastName = "Smith", Person = person1 };
26+
_personDetailId = (int)session.Save(personDetail);
27+
28+
tx.Commit();
29+
}
30+
}
31+
32+
protected override void OnTearDown()
33+
{
34+
using (var session = OpenSession())
35+
using (var tx = session.BeginTransaction())
36+
{
37+
session.Delete("from System.Object");
38+
tx.Commit();
39+
}
40+
}
41+
42+
protected override HbmMapping GetMappings()
43+
{
44+
var mapper = new ModelMapper();
45+
mapper.Class<PersonDetail>(m =>
46+
{
47+
m.Id(t => t.PersonDetailId, a => a.Generator(Generators.Identity));
48+
m.Property(t => t.LastName,
49+
c =>
50+
{
51+
c.NotNullable(true);
52+
c.Length(32);
53+
});
54+
m.ManyToOne(t => t.Person,
55+
c =>
56+
{
57+
c.Column("PersonId");
58+
c.Unique(true);
59+
c.NotNullable(false);
60+
c.NotFound(NotFoundMode.Ignore);
61+
});
62+
});
63+
64+
mapper.Class<Person>(m =>
65+
{
66+
m.Id(t => t.PersonId, a => a.Generator(Generators.Identity));
67+
m.Property(t => t.FirstName,
68+
c =>
69+
{
70+
c.NotNullable(true);
71+
c.Length(32);
72+
});
73+
m.OneToOne(t => t.PersonDetail,
74+
oo =>
75+
{
76+
oo.PropertyReference(typeof (PersonDetail).GetProperty("Person"));
77+
oo.Cascade(Mapping.ByCode.Cascade.All);
78+
});
79+
});
80+
81+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
82+
}
83+
84+
[Test]
85+
public void ShouldConfigureSessionCorrectly()
86+
{
87+
using (var session = OpenSession())
88+
using (session.BeginTransaction())
89+
{
90+
var person1 = session.Get<Person>(_person1Id);
91+
var person2 = session.Get<Person>(_person2Id);
92+
var personDetail = session.Get<PersonDetail>(_personDetailId);
93+
94+
Assert.IsNull(person2.PersonDetail);
95+
Assert.IsNotNull(person1.PersonDetail);
96+
Assert.AreEqual(person1.PersonDetail.LastName, personDetail.LastName);
97+
Assert.AreEqual(person1.FirstName, personDetail.Person.FirstName);
98+
}
99+
}
100+
}
101+
}

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,8 @@
589589
<Compile Include="MappingByCode\IntegrationTests\NH2825\Fixture.cs" />
590590
<Compile Include="MappingByCode\IntegrationTests\NH2825\FixtureByCode.cs" />
591591
<Compile Include="MappingByCode\IntegrationTests\NH2825\Parent.cs" />
592+
<Compile Include="MappingByCode\IntegrationTests\NH3280\Domain.cs" />
593+
<Compile Include="MappingByCode\IntegrationTests\NH3280\OneToOneToInheritedProperty.cs" />
592594
<Compile Include="MappingByCode\MappersTests\AnyMapperTest.cs" />
593595
<Compile Include="MappingByCode\MappersTests\IdMapperTest.cs" />
594596
<Compile Include="MappingByCode\MappersTests\ManyToOneMapperTest.cs" />

src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,14 @@ public void PropertyReference(MemberInfo propertyInTheOtherSide)
7373
return;
7474
}
7575

76-
if (_member != null && propertyInTheOtherSide.DeclaringType != _member.GetPropertyOrFieldType())
76+
var declaringType = propertyInTheOtherSide.DeclaringType;
77+
if (_member != null && !declaringType.IsAssignableFrom(_member.GetPropertyOrFieldType()))
7778
{
7879
throw new ArgumentOutOfRangeException("propertyInTheOtherSide",
79-
string.Format("Expected a member of {0} found the member {1} of {2}", _member.GetPropertyOrFieldType(), propertyInTheOtherSide,
80-
propertyInTheOtherSide.DeclaringType));
80+
string.Format("Expected a member of {0} found the member {1} of {2}",
81+
_member.GetPropertyOrFieldType(),
82+
propertyInTheOtherSide,
83+
declaringType));
8184
}
8285

8386
_oneToOne.propertyref = propertyInTheOtherSide.Name;

0 commit comments

Comments
 (0)