Skip to content

Commit 4cde4be

Browse files
authored
Register IType CLR types as aliases (#3127)
1 parent e11f1d4 commit 4cde4be

File tree

6 files changed

+176
-26
lines changed

6 files changed

+176
-26
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Linq;
12+
using NHibernate.Cfg.MappingSchema;
13+
using NHibernate.Mapping.ByCode;
14+
using NHibernate.Type;
15+
using NUnit.Framework;
16+
using NHibernate.Linq;
17+
18+
namespace NHibernate.Test.NHSpecificTest.GH3127
19+
{
20+
using System.Threading.Tasks;
21+
[TestFixture]
22+
public class StringTypeAsGenericParamByCodeFixtureAsync : TestCaseMappingByCode
23+
{
24+
protected override HbmMapping GetMappings()
25+
{
26+
var mapper = new ModelMapper();
27+
mapper.Class<Entity>(rc =>
28+
{
29+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
30+
rc.Property(x => x.Name, x => x.Type<StringType>());
31+
rc.Property(x => x.NameAnsi, x => x.Type<AnsiStringType>());
32+
rc.Property(x => x.Amount, x => x.Type<CurrencyType>());
33+
});
34+
35+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
36+
}
37+
38+
protected override void OnSetUp()
39+
{
40+
using (var session = OpenSession())
41+
using (var transaction = session.BeginTransaction())
42+
{
43+
var e1 = new Entity { Name = "Bob", NameAnsi = "Bob", Amount = 10.0M };
44+
session.Save(e1);
45+
46+
transaction.Commit();
47+
}
48+
}
49+
50+
protected override void OnTearDown()
51+
{
52+
using (var session = OpenSession())
53+
using (var transaction = session.BeginTransaction())
54+
{
55+
session.CreateQuery("delete from System.Object").ExecuteUpdate();
56+
57+
transaction.Commit();
58+
}
59+
}
60+
61+
[Test]
62+
public async Task QueryWorksAsync()
63+
{
64+
using (var session = OpenSession())
65+
{
66+
var result = from e in session.Query<Entity>()
67+
where e.Name == "Bob" && e.NameAnsi == "Bob" && e.Amount == 10.0M
68+
select e;
69+
70+
Assert.That(await (result.ToListAsync()), Has.Count.EqualTo(1));
71+
}
72+
}
73+
}
74+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.GH3127
4+
{
5+
class Entity
6+
{
7+
public virtual Guid Id { get; set; }
8+
public virtual string Name { get; set; }
9+
public virtual string NameAnsi { get; set; }
10+
public virtual decimal Amount { get; set; }
11+
}
12+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System.Linq;
2+
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode;
4+
using NHibernate.Type;
5+
using NUnit.Framework;
6+
7+
namespace NHibernate.Test.NHSpecificTest.GH3127
8+
{
9+
[TestFixture]
10+
public class StringTypeAsGenericParamByCodeFixture : TestCaseMappingByCode
11+
{
12+
protected override HbmMapping GetMappings()
13+
{
14+
var mapper = new ModelMapper();
15+
mapper.Class<Entity>(rc =>
16+
{
17+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
18+
rc.Property(x => x.Name, x => x.Type<StringType>());
19+
rc.Property(x => x.NameAnsi, x => x.Type<AnsiStringType>());
20+
rc.Property(x => x.Amount, x => x.Type<CurrencyType>());
21+
});
22+
23+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
24+
}
25+
26+
protected override void OnSetUp()
27+
{
28+
using (var session = OpenSession())
29+
using (var transaction = session.BeginTransaction())
30+
{
31+
var e1 = new Entity { Name = "Bob", NameAnsi = "Bob", Amount = 10.0M };
32+
session.Save(e1);
33+
34+
transaction.Commit();
35+
}
36+
}
37+
38+
protected override void OnTearDown()
39+
{
40+
using (var session = OpenSession())
41+
using (var transaction = session.BeginTransaction())
42+
{
43+
session.CreateQuery("delete from System.Object").ExecuteUpdate();
44+
45+
transaction.Commit();
46+
}
47+
}
48+
49+
[Test]
50+
public void QueryWorks()
51+
{
52+
using (var session = OpenSession())
53+
{
54+
var result = from e in session.Query<Entity>()
55+
where e.Name == "Bob" && e.NameAnsi == "Bob" && e.Amount == 10.0M
56+
select e;
57+
58+
Assert.That(result.ToList(), Has.Count.EqualTo(1));
59+
}
60+
}
61+
}
62+
}

src/NHibernate.Test/TypesTest/TimestampTypeFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void ObsoleteMessage()
2424
var log = spy.GetWholeLog();
2525
Assert.That(
2626
log,
27-
Does.Contain($"NHibernate.Type.TimestampType ({NHibernateUtil.Timestamp.Name}) is obsolete. Please use DateTimeType instead.").IgnoreCase);
27+
Does.Contain("NHibernate.Type.TimestampType is obsolete. Please use DateTimeType instead.").IgnoreCase);
2828
}
2929
}
3030
}

src/NHibernate/Type/TypeFactory.cs

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Concurrent;
33
using System.Collections.Generic;
44
using System.Globalization;
5+
using System.Linq;
56
using System.Reflection;
67
using System.Xml;
78
using System.Xml.Linq;
@@ -107,10 +108,7 @@ private enum TypeClassification
107108
/// <param name="aliases">The additional aliases to map to the type. Use <see cref="EmptyAliases"/> if none.</param>
108109
public static void RegisterType(System.Type systemType, IType nhibernateType, IEnumerable<string> aliases)
109110
{
110-
var typeAliases = new List<string>(aliases);
111-
typeAliases.AddRange(GetClrTypeAliases(systemType));
112-
113-
RegisterType(nhibernateType, typeAliases);
111+
RegisterType(nhibernateType, GetClrTypeAliases(systemType, aliases));
114112
}
115113

116114
/// <summary>
@@ -138,10 +136,7 @@ private static void RegisterType(
138136
GetNullableTypeWithLengthOrScale ctorLengthOrScale,
139137
bool @override)
140138
{
141-
var typeAliases = new List<string>(aliases);
142-
typeAliases.AddRange(GetClrTypeAliases(systemType));
143-
144-
RegisterType(nhibernateType, typeAliases, ctorLengthOrScale, @override);
139+
RegisterType(nhibernateType, GetClrTypeAliases(systemType, aliases), ctorLengthOrScale, @override);
145140
}
146141

147142
/// <summary>
@@ -169,20 +164,16 @@ private static void RegisterType(
169164
GetNullableTypeWithPrecision ctorPrecision,
170165
bool @override)
171166
{
172-
var typeAliases = new List<string>(aliases);
173-
typeAliases.AddRange(GetClrTypeAliases(systemType));
174-
175-
RegisterType(nhibernateType, typeAliases, ctorPrecision, @override);
167+
RegisterType(nhibernateType, GetClrTypeAliases(systemType, aliases), ctorPrecision, @override);
176168
}
177169

178-
private static IEnumerable<string> GetClrTypeAliases(System.Type systemType)
170+
private static List<string> GetClrTypeAliases(System.Type systemType, IEnumerable<string> aliases)
179171
{
180-
var typeAliases =
181-
new List<string>
182-
{
183-
systemType.FullName,
184-
systemType.AssemblyQualifiedName
185-
};
172+
var typeAliases = new List<string>();
173+
typeAliases.AddRange(aliases);
174+
typeAliases.Add(systemType.FullName);
175+
typeAliases.Add(systemType.AssemblyQualifiedName);
176+
186177
if (systemType.IsValueType)
187178
{
188179
// Also register Nullable<systemType> for ValueTypes
@@ -195,17 +186,15 @@ private static IEnumerable<string> GetClrTypeAliases(System.Type systemType)
195186

196187
private static void RegisterType(IType nhibernateType, IEnumerable<string> aliases)
197188
{
198-
var typeAliases = new List<string>(aliases) { nhibernateType.Name };
199-
foreach (var alias in typeAliases)
189+
foreach (var alias in GetTypeAliases(nhibernateType, aliases))
200190
{
201191
RegisterTypeAlias(nhibernateType, alias);
202192
}
203193
}
204194

205195
private static void RegisterType(IType nhibernateType, IEnumerable<string> aliases, GetNullableTypeWithLengthOrScale ctorLengthOrScale, bool @override = false)
206196
{
207-
var typeAliases = new List<string>(aliases) { nhibernateType.Name };
208-
foreach (var alias in typeAliases)
197+
foreach (var alias in GetTypeAliases(nhibernateType, aliases))
209198
{
210199
RegisterTypeAlias(nhibernateType, alias);
211200
if (@override)
@@ -222,8 +211,7 @@ private static void RegisterType(IType nhibernateType, IEnumerable<string> alias
222211

223212
private static void RegisterType(IType nhibernateType, IEnumerable<string> aliases, GetNullableTypeWithPrecision ctorPrecision, bool @override = false)
224213
{
225-
var typeAliases = new List<string>(aliases) { nhibernateType.Name };
226-
foreach (var alias in typeAliases)
214+
foreach (var alias in GetTypeAliases(nhibernateType, aliases))
227215
{
228216
RegisterTypeAlias(nhibernateType, alias);
229217
if (@override)
@@ -238,6 +226,11 @@ private static void RegisterType(IType nhibernateType, IEnumerable<string> alias
238226
}
239227
}
240228

229+
private static IEnumerable<string> GetTypeAliases(IType nhibernateType, IEnumerable<string> aliases)
230+
{
231+
return GetClrTypeAliases(nhibernateType.GetType(), aliases.Append(nhibernateType.Name));
232+
}
233+
241234
private static void RegisterTypeAlias(IType nhibernateType, string alias)
242235
{
243236
typeByTypeOfName[alias] = nhibernateType;

src/NHibernate/Util/EnumerableExtensions.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,5 +117,14 @@ internal static IEnumerable<T> CastOrDefault<T>(this IEnumerable list)
117117
: (T) obj;
118118
}
119119
}
120+
121+
#if NETFX && !NET471_OR_GREATER
122+
internal static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element)
123+
{
124+
foreach (var item in source)
125+
yield return item;
126+
yield return element;
127+
}
128+
#endif
120129
}
121130
}

0 commit comments

Comments
 (0)