From 9ae9e38ca47128a3c0cdfad500ddbe0778dffb63 Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Tue, 25 Nov 2014 01:08:02 +1300 Subject: [PATCH] NH-2824, NH-3452 - Add ability to specify column options IIdMapper --- .../MappersTests/IdMapperTest.cs | 30 +++++++++ src/NHibernate/Mapping/ByCode/IIdMapper.cs | 3 +- .../Mapping/ByCode/Impl/IdMapper.cs | 61 ++++++++++++++++++- 3 files changed, 90 insertions(+), 4 deletions(-) diff --git a/src/NHibernate.Test/MappingByCode/MappersTests/IdMapperTest.cs b/src/NHibernate.Test/MappingByCode/MappersTests/IdMapperTest.cs index 765971a0fb2..53c600f2975 100644 --- a/src/NHibernate.Test/MappingByCode/MappersTests/IdMapperTest.cs +++ b/src/NHibernate.Test/MappingByCode/MappersTests/IdMapperTest.cs @@ -176,5 +176,35 @@ public void CanSetLength() mapper.Length(10); Assert.That(hbmId.length, Is.EqualTo("10")); } + + [Test] + public void CanSetPrecision() + { + //NH-2824 + var hbmId = new HbmId(); + var mapper = new IdMapper(null, hbmId); + mapper.Column(x => x.Precision(10)); + Assert.That(hbmId.column[0].precision, Is.EqualTo("10")); + } + + [Test] + public void CanSetScale() + { + //NH-2824 + var hbmId = new HbmId(); + var mapper = new IdMapper(null, hbmId); + mapper.Column(x => x.Scale(10)); + Assert.That(hbmId.column[0].scale, Is.EqualTo("10")); + } + + [Test] + public void CanSqlType() + { + //NH-3452 + var hbmId = new HbmId(); + var mapper = new IdMapper(null, hbmId); + mapper.Column(x => x.SqlType("CHAR(10)")); + Assert.That(hbmId.column[0].sqltype, Is.EqualTo("CHAR(10)")); + } } } \ No newline at end of file diff --git a/src/NHibernate/Mapping/ByCode/IIdMapper.cs b/src/NHibernate/Mapping/ByCode/IIdMapper.cs index 7166e9fcb6e..ef9627d9f6b 100644 --- a/src/NHibernate/Mapping/ByCode/IIdMapper.cs +++ b/src/NHibernate/Mapping/ByCode/IIdMapper.cs @@ -3,7 +3,7 @@ namespace NHibernate.Mapping.ByCode { - public interface IIdMapper : IAccessorPropertyMapper + public interface IIdMapper : IAccessorPropertyMapper, IColumnsMapper { void Generator(IGeneratorDef generator); void Generator(IGeneratorDef generator, Action generatorMapping); @@ -15,7 +15,6 @@ public interface IIdMapper : IAccessorPropertyMapper //void Column(Action columnMapper); //void Columns(params Action[] columnMapper); void UnsavedValue(object value); - void Column(string name); void Length(int length); } } \ No newline at end of file diff --git a/src/NHibernate/Mapping/ByCode/Impl/IdMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/IdMapper.cs index a082f0258a1..29164265b1d 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/IdMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/IdMapper.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using NHibernate.Cfg.MappingSchema; @@ -9,6 +10,7 @@ namespace NHibernate.Mapping.ByCode.Impl public class IdMapper : IIdMapper { private readonly IAccessorPropertyMapper accessorMapper; + private readonly MemberInfo member; private readonly HbmId hbmId; public IdMapper(HbmId hbmId) @@ -16,6 +18,7 @@ public IdMapper(HbmId hbmId) public IdMapper(MemberInfo member, HbmId hbmId) { + this.member = member; this.hbmId = hbmId; if (member != null) { @@ -68,14 +71,68 @@ public void UnsavedValue(object value) hbmId.unsavedvalue = value != null ? value.ToString() : "null"; } + public void Column(Action columnMapper) + { + if (hbmId.Columns.Count() > 1) + throw new MappingException("Multi-columns property can't be mapped through singlr-column API."); + + HbmColumn hbm = hbmId.Columns.SingleOrDefault() ?? new HbmColumn + { + name = hbmId.column1, + length = hbmId.length + }; + + string defaultColumnName = member != null ? member.Name : null; + columnMapper(new ColumnMapper(hbm, member != null ? defaultColumnName : "unnamedcolumn")); + if (hbm.sqltype != null || + hbm.@default != null || + hbm.check != null || + hbm.precision != null || + hbm.scale != null || + hbm.notnullSpecified || + hbm.uniqueSpecified || + hbm.uniquekey != null || + hbm.index != null) + { + hbmId.column = new[] {hbm}; + ResetIdPlainValues(); + } + else + { + hbmId.column1 = defaultColumnName == null || defaultColumnName != hbm.name ? hbm.name : null; + hbmId.length = hbm.length; + } + } + + public void Columns(params Action[] columnMapper) + { + ResetIdPlainValues(); + int i = 1; + var columns = new List(columnMapper.Length); + foreach (var action in columnMapper) + { + var hbm = new HbmColumn(); + string defaultColumnName = (member != null ? member.Name : "unnamedcolumn") + i++; + action(new ColumnMapper(hbm, defaultColumnName)); + columns.Add(hbm); + } + hbmId.column = columns.ToArray(); + } + public void Column(string name) { - hbmId.column1 = name; + Column(x => x.Name(name)); } public void Length(int length) { - hbmId.length = length.ToString(); + Column(x => x.Length(length)); + } + + private void ResetIdPlainValues() + { + hbmId.column1 = null; + hbmId.length = null; } private void ApplyGenerator(IGeneratorDef generator)