Skip to content

Commit 6551301

Browse files
author
Gunnar Liljas
committed
NH3392 - Unit test and fix
1 parent 6fedcee commit 6551301

File tree

5 files changed

+215
-2
lines changed

5 files changed

+215
-2
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using NHibernate.Linq;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.NHSpecificTest.NH3392
7+
{
8+
[TestFixture]
9+
public class Fixture : BugTestCase
10+
{
11+
protected override void OnTearDown()
12+
{
13+
using (ISession session = OpenSession())
14+
using (ITransaction transaction = session.BeginTransaction())
15+
{
16+
session.Delete("from Kid");
17+
session.Delete("from FriendOfTheFamily");
18+
session.Delete("from Dad");
19+
session.Delete("from Mum");
20+
session.Flush();
21+
transaction.Commit();
22+
}
23+
}
24+
25+
[Test]
26+
public void ExpandSubCollectionWithEmbeddedCompositeID()
27+
{
28+
using (ISession s = OpenSession())
29+
{
30+
31+
var jenny = new Mum { Name = "Jenny" };
32+
s.Save(jenny);
33+
var benny = new Dad { Name = "Benny" };
34+
s.Save(benny);
35+
var lenny = new Dad { Name = "Lenny" };
36+
s.Save(lenny);
37+
var jimmy = new Kid { Name = "Jimmy", MumId = jenny.Id, DadId = benny.Id };
38+
s.Save(jimmy);
39+
var timmy = new Kid { Name = "Timmy", MumId = jenny.Id, DadId = lenny.Id };
40+
s.Save(jimmy);
41+
s.Flush();
42+
}
43+
44+
using (var s = OpenSession())
45+
{
46+
var result=s.Query<Mum>().Select(x => new { x, x.Kids }).ToList();
47+
Assert.That(result.Count, Is.EqualTo(1));
48+
Assert.That(result[0].x.Kids, Is.EquivalentTo(result[0].Kids));
49+
}
50+
}
51+
52+
[Test]
53+
public void ExpandSubCollectionWithCompositeID()
54+
{
55+
using (ISession s = OpenSession())
56+
{
57+
58+
var jenny = new Mum { Name = "Jenny" };
59+
s.Save(jenny);
60+
var benny = new Dad { Name = "Benny" };
61+
s.Save(benny);
62+
var lenny = new Dad { Name = "Lenny" };
63+
s.Save(lenny);
64+
var jimmy = new FriendOfTheFamily { Name = "Jimmy", Id = new MumAndDadId { MumId = jenny.Id, DadId = benny.Id } };
65+
s.Save(jimmy);
66+
var timmy = new FriendOfTheFamily { Name = "Timmy", Id = new MumAndDadId { MumId = jenny.Id, DadId = lenny.Id } };
67+
s.Save(jimmy);
68+
s.Flush();
69+
}
70+
71+
using (var s = OpenSession())
72+
{
73+
var result=s.Query<Mum>().Select(x => new { x, x.Friends }).ToList();
74+
Assert.That(result.Count, Is.EqualTo(1));
75+
Assert.That(result[0].x.Friends, Is.EquivalentTo(result[0].Friends));
76+
}
77+
}
78+
79+
80+
}
81+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3+
namespace="NHibernate.Test.NHSpecificTest.NH3392"
4+
assembly="NHibernate.Test">
5+
<class name="Dad" >
6+
<id name="Id">
7+
<generator class="native"/>
8+
</id>
9+
<property name="Name" />
10+
<set cascade="save-update" name="Kids" inverse="true">
11+
<key>
12+
<column name="DadId" />
13+
</key>
14+
<one-to-many class="Kid" />
15+
</set>
16+
<set cascade="save-update" name="Friends" inverse="true">
17+
<key>
18+
<column name="DadId" />
19+
</key>
20+
<one-to-many class="FriendOfTheFamily" />
21+
</set>
22+
</class>
23+
24+
<class name="Mum" >
25+
<id name="Id">
26+
<generator class="native"/>
27+
</id>
28+
<property name="Name" />
29+
<set cascade="save-update" name="Kids" inverse="true">
30+
<key>
31+
<column name="MumId" />
32+
</key>
33+
<one-to-many class="Kid" />
34+
</set>
35+
<set cascade="save-update" name="Friends" inverse="true">
36+
<key>
37+
<column name="MumId" />
38+
</key>
39+
<one-to-many class="FriendOfTheFamily" />
40+
</set>
41+
</class>
42+
43+
<class name="Kid" >
44+
<composite-id>
45+
<key-property name="MumId" />
46+
<key-property name="DadId" />
47+
</composite-id>
48+
<property name="Name" />
49+
</class>
50+
51+
<class name="FriendOfTheFamily" >
52+
<composite-id name="Id" class="MumAndDadId">
53+
<key-property name="MumId" />
54+
<key-property name="DadId" />
55+
</composite-id>
56+
<property name="Name" />
57+
</class>
58+
59+
</hibernate-mapping>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace NHibernate.Test.NHSpecificTest.NH3392
5+
{
6+
public class Dad
7+
{
8+
public virtual int Id { get; set; }
9+
public virtual string Name { get; set; }
10+
public virtual ISet<Kid> Kids { get; set; }
11+
public virtual ISet<FriendOfTheFamily> Friends { get; set; }
12+
}
13+
public class Mum
14+
{
15+
public virtual int Id { get; set; }
16+
public virtual string Name { get; set; }
17+
public virtual ISet<Kid> Kids { get; set; }
18+
public virtual ISet<FriendOfTheFamily> Friends { get; set; }
19+
}
20+
public class Kid
21+
{
22+
public virtual int MumId { get; set; }
23+
public virtual int DadId { get; set; }
24+
public virtual string Name { get; set; }
25+
26+
public override int GetHashCode()
27+
{
28+
return (MumId + "|" + DadId).GetHashCode();
29+
}
30+
31+
public override bool Equals(object obj)
32+
{
33+
var child = obj as Kid;
34+
return child != null && (MumId == child.MumId && DadId == child.DadId);
35+
}
36+
}
37+
38+
public class FriendOfTheFamily
39+
{
40+
public virtual MumAndDadId Id { get; set; }
41+
public virtual string Name { get; set; }
42+
}
43+
44+
public class MumAndDadId
45+
{
46+
public virtual int MumId { get; set; }
47+
public virtual int DadId { get; set; }
48+
public override int GetHashCode()
49+
{
50+
return (MumId + "|" + DadId).GetHashCode();
51+
}
52+
53+
public override bool Equals(object obj)
54+
{
55+
var child = obj as MumAndDadId;
56+
return child != null && (MumId == child.MumId && DadId == child.DadId);
57+
}
58+
}
59+
}

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,8 @@
676676
<Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Domain.cs" />
677677
<Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Fixture.cs" />
678678
<Compile Include="Component\Basic\ComponentWithUniqueConstraintTests.cs" />
679+
<Compile Include="NHSpecificTest\NH3392\Fixture.cs" />
680+
<Compile Include="NHSpecificTest\NH3392\Model.cs" />
679681
<Compile Include="NHSpecificTest\NH3459\Fixture.cs" />
680682
<Compile Include="NHSpecificTest\NH3459\Order.cs" />
681683
<Compile Include="NHSpecificTest\NH2692\Fixture.cs" />
@@ -2861,6 +2863,7 @@
28612863
<EmbeddedResource Include="NHSpecificTest\LoadingNullEntityInSet\Mappings.hbm.xml" />
28622864
</ItemGroup>
28632865
<ItemGroup>
2866+
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
28642867
<Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
28652868
</ItemGroup>
28662869
<ItemGroup>
@@ -2971,6 +2974,9 @@
29712974
<EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" />
29722975
</ItemGroup>
29732976
<ItemGroup>
2977+
<EmbeddedResource Include="NHSpecificTest\NH3392\Mappings.hbm.xml">
2978+
<SubType>Designer</SubType>
2979+
</EmbeddedResource>
29742980
<EmbeddedResource Include="NHSpecificTest\NH2692\Mappings.hbm.xml">
29752981
<SubType>Designer</SubType>
29762982
</EmbeddedResource>

src/NHibernate/Linq/NestedSelects/NestedSelectRewriter.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,16 @@ private static Expression GetIdentifier(ISessionFactory sessionFactory, Expressi
223223
var classMetadata = sessionFactory.GetClassMetadata(expression.Type);
224224
if (classMetadata == null)
225225
return Expression.Constant(null);
226-
227-
return ConvertToObject(Expression.PropertyOrField(expression, classMetadata.IdentifierPropertyName));
226+
227+
var propertyName=classMetadata.IdentifierPropertyName;
228+
NHibernate.Type.EmbeddedComponentType componentType;
229+
if (propertyName == null && (componentType=classMetadata.IdentifierType as NHibernate.Type.EmbeddedComponentType)!=null)
230+
{
231+
//The identifier is an embedded composite key. We only need one property from it for a null check
232+
propertyName = componentType.PropertyNames.First();
233+
}
234+
235+
return ConvertToObject(Expression.PropertyOrField(expression, propertyName));
228236
}
229237

230238
private static LambdaExpression CreateSelector(IEnumerable<ExpressionHolder> expressions, int tuple)

0 commit comments

Comments
 (0)