Skip to content

Commit 233c3b4

Browse files
Add in ByCode support of all type mappings on Id (#1848)
1 parent ea4c7ff commit 233c3b4

File tree

3 files changed

+145
-7
lines changed

3 files changed

+145
-7
lines changed

src/NHibernate.Test/MappingByCode/MappersTests/IdMapperTest.cs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
using System;
12
using System.Linq;
23
using System.Reflection;
34
using NHibernate.Mapping.ByCode;
45
using NHibernate.Cfg.MappingSchema;
56
using NHibernate.Mapping.ByCode.Impl;
7+
using NHibernate.Type;
68
using NUnit.Framework;
79

810
namespace NHibernate.Test.MappingByCode.MappersTests
@@ -80,6 +82,11 @@ private class Related
8082
public int Id { get; set; }
8183
}
8284

85+
private enum MyEnum
86+
{
87+
One
88+
}
89+
8390
[Test]
8491
public void CanSetGeneratorForeign()
8592
{
@@ -210,5 +217,82 @@ public void CanSqlType()
210217
mapper.Column(x => x.SqlType("CHAR(10)"));
211218
Assert.That(hbmId.column[0].sqltype, Is.EqualTo("CHAR(10)"));
212219
}
220+
221+
[Test]
222+
public void WhenSetTypeByITypeThenSetTypeName()
223+
{
224+
var hbmId = new HbmId();
225+
var mapper = new IdMapper(null, hbmId);
226+
mapper.Type(NHibernateUtil.String);
227+
228+
Assert.That(hbmId.Type.name, Is.EqualTo("String"));
229+
}
230+
231+
[Test]
232+
public void WhenSetTypeByIUserTypeThenSetTypeName()
233+
{
234+
var hbmId = new HbmId();
235+
var mapper = new IdMapper(null, hbmId);
236+
mapper.Type<MyType>();
237+
238+
Assert.That(hbmId.Type.name, Does.Contain("MyType"));
239+
Assert.That(hbmId.type, Is.Null);
240+
}
241+
242+
[Test]
243+
public void WhenSetTypeByICompositeUserTypeThenSetTypeName()
244+
{
245+
var hbmId = new HbmId();
246+
var mapper = new IdMapper(null, hbmId);
247+
mapper.Type<MyCompoType>();
248+
249+
Assert.That(hbmId.Type.name, Does.Contain("MyCompoType"));
250+
Assert.That(hbmId.type, Is.Null);
251+
}
252+
253+
[Test]
254+
public void WhenSetTypeByIUserTypeWithParamsThenSetType()
255+
{
256+
var hbmId = new HbmId();
257+
var mapper = new IdMapper(null, hbmId);
258+
mapper.Type<MyType>(new { Param1 = "a", Param2 = 12 });
259+
260+
Assert.That(hbmId.type1, Is.Null);
261+
Assert.That(hbmId.Type.name, Does.Contain("MyType"));
262+
Assert.That(hbmId.Type.param, Has.Length.EqualTo(2));
263+
Assert.That(hbmId.Type.param.Select(p => p.name), Is.EquivalentTo(new [] {"Param1", "Param2"}));
264+
Assert.That(hbmId.Type.param.Select(p => p.GetText()), Is.EquivalentTo(new [] {"a", "12"}));
265+
}
266+
267+
[Test]
268+
public void WhenSetTypeByIUserTypeWithNullParamsThenSetTypeName()
269+
{
270+
var hbmId = new HbmId();
271+
var mapper = new IdMapper(null, hbmId);
272+
mapper.Type<MyType>(null);
273+
274+
Assert.That(hbmId.Type.name, Does.Contain("MyType"));
275+
Assert.That(hbmId.type, Is.Null);
276+
}
277+
278+
[Test]
279+
public void WhenSetTypeByITypeTypeThenSetType()
280+
{
281+
var hbmId = new HbmId();
282+
var mapper = new IdMapper(null, hbmId);
283+
mapper.Type<EnumStringType<MyEnum>>();
284+
285+
Assert.That(hbmId.Type.name, Does.Contain(typeof(EnumStringType<MyEnum>).FullName));
286+
Assert.That(hbmId.type, Is.Null);
287+
}
288+
289+
[Test]
290+
public void WhenSetInvalidTypeThenThrow()
291+
{
292+
var hbmId = new HbmId();
293+
var mapper = new IdMapper(null, hbmId);
294+
Assert.That(() => mapper.Type(typeof(object), null), Throws.TypeOf<ArgumentOutOfRangeException>());
295+
Assert.That(() => mapper.Type(null, null), Throws.TypeOf<ArgumentNullException>());
296+
}
213297
}
214298
}
Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using NHibernate.Mapping.ByCode.Impl;
23
using NHibernate.Type;
4+
using NHibernate.Util;
35

46
namespace NHibernate.Mapping.ByCode
57
{
@@ -9,12 +11,31 @@ public interface IIdMapper : IAccessorPropertyMapper, IColumnsMapper
911
void Generator(IGeneratorDef generator, Action<IGeneratorMapper> generatorMapping);
1012

1113
void Type(IIdentifierType persistentType);
12-
//void Type<TPersistentType>() where TPersistentType : IIdentifierType;
13-
//void Type<TPersistentType>(object parameters) where TPersistentType : IIdentifierType;
14-
//void Type(System.System.Type persistentType, object parameters);
15-
//void Column(Action<IColumnMapper> columnMapper);
16-
//void Columns(params Action<IColumnMapper>[] columnMapper);
1714
void UnsavedValue(object value);
1815
void Length(int length);
1916
}
20-
}
17+
18+
public static class IdMapperExtensions
19+
{
20+
public static void Type<TPersistentType>(this IIdMapper idMapper)
21+
{
22+
Type<TPersistentType>(idMapper, null);
23+
}
24+
25+
public static void Type<TPersistentType>(this IIdMapper idMapper, object parameters)
26+
{
27+
Type(idMapper, typeof (TPersistentType), parameters);
28+
}
29+
30+
// 6.0 TODO: move into IIdMapper,
31+
// and probably add an ITypeMapper for mutualizing it with IElementMapper and IPropertyMapper
32+
// (Note that there is no IKeyPropertyMapper to be concerned with, the KeyPropertyMapper use IPropertyMapper
33+
// directly instead.)
34+
public static void Type(this IIdMapper idMapper, System.Type persistentType, object parameters)
35+
{
36+
ReflectHelper
37+
.CastOrThrow<IdMapper>(idMapper, "Type method with a type argument")
38+
.Type(persistentType, parameters);
39+
}
40+
}
41+
}

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

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Reflection;
55
using NHibernate.Cfg.MappingSchema;
66
using NHibernate.Type;
7+
using NHibernate.UserTypes;
78

89
namespace NHibernate.Mapping.ByCode.Impl
910
{
@@ -66,6 +67,38 @@ public void Type(IIdentifierType persistentType)
6667
}
6768
}
6869

70+
public void Type(System.Type persistentType, object parameters)
71+
{
72+
if (persistentType == null)
73+
{
74+
throw new ArgumentNullException(nameof(persistentType));
75+
}
76+
if (!typeof (IUserType).IsAssignableFrom(persistentType) && !typeof (IType).IsAssignableFrom(persistentType) && !typeof (ICompositeUserType).IsAssignableFrom(persistentType))
77+
{
78+
throw new ArgumentOutOfRangeException(nameof(persistentType), "Expected type implementing IUserType, ICompositeUserType or IType.");
79+
}
80+
if (parameters != null)
81+
{
82+
hbmId.type1 = null;
83+
var hbmType = new HbmType
84+
{
85+
name = persistentType.AssemblyQualifiedName,
86+
param = (from pi in parameters.GetType().GetProperties()
87+
let pname = pi.Name
88+
let pvalue = pi.GetValue(parameters, null)
89+
select
90+
new HbmParam {name = pname, Text = new[] {ReferenceEquals(pvalue, null) ? "null" : pvalue.ToString()}})
91+
.ToArray()
92+
};
93+
hbmId.type = hbmType;
94+
}
95+
else
96+
{
97+
hbmId.type1 = persistentType.AssemblyQualifiedName;
98+
hbmId.type = null;
99+
}
100+
}
101+
69102
public void UnsavedValue(object value)
70103
{
71104
hbmId.unsavedvalue = value != null ? value.ToString() : "null";
@@ -182,4 +215,4 @@ public void Access(System.Type accessorType) {}
182215

183216
#endregion
184217
}
185-
}
218+
}

0 commit comments

Comments
 (0)