Skip to content

Commit 6e15d71

Browse files
committed
Merge pull request #382 from hazzik/NH-2824
NH-2824, NH-3452 - Add ability to specify column options for IIdMapper
2 parents b03c343 + 9ae9e38 commit 6e15d71

File tree

3 files changed

+90
-4
lines changed

3 files changed

+90
-4
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,35 @@ public void CanSetLength()
176176
mapper.Length(10);
177177
Assert.That(hbmId.length, Is.EqualTo("10"));
178178
}
179+
180+
[Test]
181+
public void CanSetPrecision()
182+
{
183+
//NH-2824
184+
var hbmId = new HbmId();
185+
var mapper = new IdMapper(null, hbmId);
186+
mapper.Column(x => x.Precision(10));
187+
Assert.That(hbmId.column[0].precision, Is.EqualTo("10"));
188+
}
189+
190+
[Test]
191+
public void CanSetScale()
192+
{
193+
//NH-2824
194+
var hbmId = new HbmId();
195+
var mapper = new IdMapper(null, hbmId);
196+
mapper.Column(x => x.Scale(10));
197+
Assert.That(hbmId.column[0].scale, Is.EqualTo("10"));
198+
}
199+
200+
[Test]
201+
public void CanSqlType()
202+
{
203+
//NH-3452
204+
var hbmId = new HbmId();
205+
var mapper = new IdMapper(null, hbmId);
206+
mapper.Column(x => x.SqlType("CHAR(10)"));
207+
Assert.That(hbmId.column[0].sqltype, Is.EqualTo("CHAR(10)"));
208+
}
179209
}
180210
}

src/NHibernate/Mapping/ByCode/IIdMapper.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace NHibernate.Mapping.ByCode
55
{
6-
public interface IIdMapper : IAccessorPropertyMapper
6+
public interface IIdMapper : IAccessorPropertyMapper, IColumnsMapper
77
{
88
void Generator(IGeneratorDef generator);
99
void Generator(IGeneratorDef generator, Action<IGeneratorMapper> generatorMapping);
@@ -15,7 +15,6 @@ public interface IIdMapper : IAccessorPropertyMapper
1515
//void Column(Action<IColumnMapper> columnMapper);
1616
//void Columns(params Action<IColumnMapper>[] columnMapper);
1717
void UnsavedValue(object value);
18-
void Column(string name);
1918
void Length(int length);
2019
}
2120
}

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

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Reflection;
45
using NHibernate.Cfg.MappingSchema;
@@ -9,13 +10,15 @@ namespace NHibernate.Mapping.ByCode.Impl
910
public class IdMapper : IIdMapper
1011
{
1112
private readonly IAccessorPropertyMapper accessorMapper;
13+
private readonly MemberInfo member;
1214
private readonly HbmId hbmId;
1315

1416
public IdMapper(HbmId hbmId)
1517
: this(null, hbmId) {}
1618

1719
public IdMapper(MemberInfo member, HbmId hbmId)
1820
{
21+
this.member = member;
1922
this.hbmId = hbmId;
2023
if (member != null)
2124
{
@@ -68,14 +71,68 @@ public void UnsavedValue(object value)
6871
hbmId.unsavedvalue = value != null ? value.ToString() : "null";
6972
}
7073

74+
public void Column(Action<IColumnMapper> columnMapper)
75+
{
76+
if (hbmId.Columns.Count() > 1)
77+
throw new MappingException("Multi-columns property can't be mapped through singlr-column API.");
78+
79+
HbmColumn hbm = hbmId.Columns.SingleOrDefault() ?? new HbmColumn
80+
{
81+
name = hbmId.column1,
82+
length = hbmId.length
83+
};
84+
85+
string defaultColumnName = member != null ? member.Name : null;
86+
columnMapper(new ColumnMapper(hbm, member != null ? defaultColumnName : "unnamedcolumn"));
87+
if (hbm.sqltype != null ||
88+
hbm.@default != null ||
89+
hbm.check != null ||
90+
hbm.precision != null ||
91+
hbm.scale != null ||
92+
hbm.notnullSpecified ||
93+
hbm.uniqueSpecified ||
94+
hbm.uniquekey != null ||
95+
hbm.index != null)
96+
{
97+
hbmId.column = new[] {hbm};
98+
ResetIdPlainValues();
99+
}
100+
else
101+
{
102+
hbmId.column1 = defaultColumnName == null || defaultColumnName != hbm.name ? hbm.name : null;
103+
hbmId.length = hbm.length;
104+
}
105+
}
106+
107+
public void Columns(params Action<IColumnMapper>[] columnMapper)
108+
{
109+
ResetIdPlainValues();
110+
int i = 1;
111+
var columns = new List<HbmColumn>(columnMapper.Length);
112+
foreach (var action in columnMapper)
113+
{
114+
var hbm = new HbmColumn();
115+
string defaultColumnName = (member != null ? member.Name : "unnamedcolumn") + i++;
116+
action(new ColumnMapper(hbm, defaultColumnName));
117+
columns.Add(hbm);
118+
}
119+
hbmId.column = columns.ToArray();
120+
}
121+
71122
public void Column(string name)
72123
{
73-
hbmId.column1 = name;
124+
Column(x => x.Name(name));
74125
}
75126

76127
public void Length(int length)
77128
{
78-
hbmId.length = length.ToString();
129+
Column(x => x.Length(length));
130+
}
131+
132+
private void ResetIdPlainValues()
133+
{
134+
hbmId.column1 = null;
135+
hbmId.length = null;
79136
}
80137

81138
private void ApplyGenerator(IGeneratorDef generator)

0 commit comments

Comments
 (0)