Skip to content

Commit ae83e33

Browse files
committed
Provide test case for nhibernate#3643
1 parent f5a7a1f commit ae83e33

File tree

3 files changed

+149
-0
lines changed

3 files changed

+149
-0
lines changed

Diff for: src/NHibernate.Test/NHSpecificTest/GH3643/Entity.cs

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
// ReSharper disable CollectionNeverUpdated.Local
6+
// ReSharper disable UnassignedGetOnlyAutoProperty
7+
8+
namespace NHibernate.Test.NHSpecificTest.GH3643
9+
{
10+
class Entity
11+
{
12+
private readonly ICollection<ChildEntity> _children = new List<ChildEntity>();
13+
public virtual EntityId Id { get; protected set; }
14+
public virtual IEnumerable<ChildEntity> Children => _children.AsEnumerable();
15+
}
16+
17+
class ChildEntity
18+
{
19+
public virtual int Id { get; protected set; }
20+
}
21+
22+
enum EntityId
23+
{
24+
Id1,
25+
Id2
26+
}
27+
}
+118
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
using System.Linq;
2+
using NHibernate.Cfg;
3+
using NHibernate.Cfg.MappingSchema;
4+
using NHibernate.Linq;
5+
using NHibernate.Mapping.ByCode;
6+
using NUnit.Framework;
7+
8+
namespace NHibernate.Test.NHSpecificTest.GH3643
9+
{
10+
[TestFixture]
11+
public class FixtureByCode : TestCaseMappingByCode
12+
{
13+
protected override void Configure(Configuration configuration)
14+
{
15+
configuration.SetProperty(Environment.UseQueryCache, "true");
16+
configuration.SetProperty(Environment.GenerateStatistics, "true");
17+
}
18+
19+
protected override HbmMapping GetMappings()
20+
{
21+
var mapper = new ModelMapper();
22+
23+
mapper.Class<Entity>(
24+
rc =>
25+
{
26+
rc.Id(x => x.Id);
27+
rc.Bag(
28+
x => x.Children,
29+
m =>
30+
{
31+
m.Access(Accessor.Field);
32+
m.Key(k => k.Column("EntityId"));
33+
},
34+
r => r.OneToMany());
35+
36+
rc.Cache(
37+
cm =>
38+
{
39+
cm.Include(CacheInclude.All);
40+
cm.Usage(CacheUsage.ReadWrite);
41+
});
42+
});
43+
44+
mapper.Class<ChildEntity>(
45+
rc =>
46+
{
47+
rc.Id(x => x.Id);
48+
rc.Cache(
49+
cm =>
50+
{
51+
cm.Include(CacheInclude.All);
52+
cm.Usage(CacheUsage.ReadWrite);
53+
});
54+
});
55+
56+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
57+
}
58+
59+
protected override void OnSetUp()
60+
{
61+
using var session = OpenSession();
62+
using var transaction = session.BeginTransaction();
63+
64+
session.CreateSQLQuery(
65+
"INSERT INTO Entity (Id) VALUES (0)"
66+
).ExecuteUpdate();
67+
68+
session.CreateSQLQuery(
69+
"INSERT INTO ChildEntity (Id, EntityId) VALUES (0, 0)"
70+
).ExecuteUpdate();
71+
72+
session.CreateSQLQuery(
73+
"INSERT INTO ChildEntity (Id, EntityId) VALUES (1, 0)"
74+
).ExecuteUpdate();
75+
76+
transaction.Commit();
77+
}
78+
79+
protected override void OnTearDown()
80+
{
81+
using var session = OpenSession();
82+
using var transaction = session.BeginTransaction();
83+
84+
session.CreateSQLQuery("DELETE FROM ChildEntity").ExecuteUpdate();
85+
session.CreateSQLQuery("DELETE FROM Entity").ExecuteUpdate();
86+
87+
transaction.Commit();
88+
}
89+
90+
[Test]
91+
public void LoadsEntityWithEnumIdAndChildrenUsingQueryCache()
92+
{
93+
LoadEntityByNameWithQueryCache(); // warm up cache
94+
95+
var entity = LoadEntityByNameWithQueryCache();
96+
97+
Assert.That(entity.Children.Count(), Is.EqualTo(2));
98+
99+
Assert.That(Sfi.Statistics.QueryExecutionCount, Is.EqualTo(1), "Unexpected execution count");
100+
Assert.That(Sfi.Statistics.QueryCachePutCount, Is.EqualTo(1), "Unexpected cache put count");
101+
Assert.That(Sfi.Statistics.QueryCacheHitCount, Is.EqualTo(1), "Unexpected cache hit count");
102+
}
103+
104+
private Entity LoadEntityByNameWithQueryCache()
105+
{
106+
using var session = OpenSession();
107+
using var transaction = session.BeginTransaction();
108+
var entity = session
109+
.Query<Entity>()
110+
.FetchMany(x => x.Children)
111+
.WithOptions(opt => opt.SetCacheable(true))
112+
.ToList()[0];
113+
114+
transaction.Commit();
115+
return entity;
116+
}
117+
}
118+
}

Diff for: src/NHibernate.sln.DotSettings

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
2222
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /&gt;</s:String>
2323
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
24+
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=15b5b1f1_002D457c_002D4ca6_002Db278_002D5615aedc07d3/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
25+
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=236f7aa5_002D7b06_002D43ca_002Dbf2a_002D9b31bfcff09a/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="CONSTANT_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
26+
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=4a98fdf6_002D7d98_002D4f5a_002Dafeb_002Dea44ad98c70c/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="_" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
2427
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
2528
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
2629
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
@@ -29,6 +32,7 @@
2932
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
3033
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
3134
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean>
35+
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
3236
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002EFormat_002ESettingsUpgrade_002EAlignmentTabFillStyleMigration/@EntryIndexedValue">True</s:Boolean>
3337
<s:Boolean x:Key="/Default/Environment/UnitTesting/SeparateAppDomainPerAssembly/@EntryValue">True</s:Boolean>
3438
<s:Boolean x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=0BE95D01E0F2244E97F5FEFAD1EB1A63/@KeyIndexDefined">True</s:Boolean>

0 commit comments

Comments
 (0)