Skip to content

Commit 3ac4de1

Browse files
committed
NH-3234 - Fix inversion of identity-map
1 parent 12676c1 commit 3ac4de1

File tree

5 files changed

+136
-1
lines changed

5 files changed

+136
-1
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace NHibernate.Test.NHSpecificTest.NH3234
5+
{
6+
public class GridLevel
7+
{
8+
public Guid Id { get; set; }
9+
}
10+
11+
public class GridWidget
12+
{
13+
public GridWidget()
14+
{
15+
Levels = new List<GridLevel>();
16+
}
17+
18+
public Guid Id { get; set; }
19+
20+
public ICollection<GridLevel> Levels { get; private set; }
21+
}
22+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using System;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.NHSpecificTest.NH3234
5+
{
6+
[TestFixture]
7+
public class Fixture : BugTestCase
8+
{
9+
private void Evict(ISession session, GridWidget widget)
10+
{
11+
session.Evict(widget);
12+
sessions.Evict(widget.GetType());
13+
}
14+
15+
private static void Save(ISession session, GridWidget widget)
16+
{
17+
if (widget.Id != Guid.Empty && !session.Contains(widget))
18+
widget = session.Merge(widget);
19+
20+
session.SaveOrUpdate(widget);
21+
session.Flush();
22+
}
23+
24+
protected override void OnTearDown()
25+
{
26+
using (var session=OpenSession())
27+
using (var tx = session.BeginTransaction())
28+
{
29+
session.Delete("from System.Object");
30+
tx.Commit();
31+
}
32+
}
33+
34+
[Test]
35+
public void ShouldNotFailWhenAddingNewLevels()
36+
{
37+
using (var session = OpenSession())
38+
{
39+
var widget = new GridWidget
40+
{
41+
Levels =
42+
{
43+
new GridLevel(),
44+
new GridLevel()
45+
},
46+
};
47+
48+
Save(session, widget);
49+
Evict(session, widget);
50+
51+
widget.Levels.Add(new GridLevel());
52+
53+
Save(session, widget);
54+
Evict(session, widget);
55+
56+
var loaded = session.Get<GridWidget>(widget.Id);
57+
58+
Assert.That(loaded.Levels.Count, Is.EqualTo(3));
59+
}
60+
}
61+
62+
[Test]
63+
public void ShouldNotFailWhenReplacingLevels()
64+
{
65+
using (var session = OpenSession())
66+
{
67+
var widget = new GridWidget
68+
{
69+
Levels =
70+
{
71+
new GridLevel(),
72+
new GridLevel()
73+
},
74+
};
75+
76+
Save(session, widget);
77+
Evict(session, widget);
78+
79+
widget.Levels.Clear();
80+
widget.Levels.Add(new GridLevel());
81+
82+
Save(session, widget);
83+
Evict(session, widget);
84+
85+
var loaded = session.Get<GridWidget>(widget.Id);
86+
87+
Assert.That(loaded.Levels.Count, Is.EqualTo(1));
88+
}
89+
}
90+
}
91+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
4+
assembly="NHibernate.Test"
5+
namespace="NHibernate.Test.NHSpecificTest.NH3234">
6+
7+
<class name="GridLevel" table="GridLevel" lazy="false">
8+
<id name="Id" generator="guid" />
9+
</class>
10+
11+
<class name="GridWidget" lazy="false">
12+
<id name="Id" generator="guid" />
13+
<bag name="Levels" schema="rm" table="GridLevel" lazy="false" cascade="all-delete-orphan">
14+
<key column="WidgetId" not-null="true" />
15+
<one-to-many class="GridLevel" />
16+
</bag>
17+
</class>
18+
19+
</hibernate-mapping>

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,8 @@
700700
<Compile Include="NHSpecificTest\NH3050\Person.cs" />
701701
<Compile Include="NHSpecificTest\NH3050\Entity.cs" />
702702
<Compile Include="NHSpecificTest\NH3050\FixtureByCode.cs" />
703+
<Compile Include="NHSpecificTest\NH3234\Fixture.cs" />
704+
<Compile Include="NHSpecificTest\NH3234\Domain.cs" />
703705
<Compile Include="NHSpecificTest\Futures\LinqToFutureValueFixture.cs" />
704706
<Compile Include="NHSpecificTest\NH3332\Culture.cs" />
705707
<Compile Include="NHSpecificTest\NH3332\DataType.cs" />
@@ -2909,6 +2911,7 @@
29092911
<EmbeddedResource Include="NHSpecificTest\NH2860\Mappings.hbm.xml" />
29102912
<EmbeddedResource Include="NHSpecificTest\NH3332\Mappings.hbm.xml" />
29112913
<EmbeddedResource Include="NHSpecificTest\NH3050\Mappings.hbm.xml" />
2914+
<EmbeddedResource Include="NHSpecificTest\NH3234\Mappings.hbm.xml" />
29122915
<EmbeddedResource Include="NHSpecificTest\NH3057\Mappings.hbm.xml" />
29132916
<EmbeddedResource Include="NHSpecificTest\NH2651\Mappings.hbm.xml" />
29142917
<EmbeddedResource Include="NHSpecificTest\NH3121\Mappings.hbm.xml" />

src/NHibernate/Util/IdentityMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ private object VerifyValidKey(object obj)
265265
public static IDictionary Invert(IDictionary map)
266266
{
267267
IDictionary result = Instantiate(map.Count);
268-
foreach (DictionaryEntry me in result)
268+
foreach (DictionaryEntry me in map)
269269
{
270270
result[me.Value] = me.Key;
271271
}

0 commit comments

Comments
 (0)