diff --git a/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/ComponentAsIdTests.cs b/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/ComponentAsIdTests.cs index 2e391577369..d976324c61f 100644 --- a/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/ComponentAsIdTests.cs +++ b/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/ComponentAsIdTests.cs @@ -29,6 +29,21 @@ private class MyComponent : IMyCompo public string Name { get; set; } } + [Test] + public void CanSpecifyUnsavedValue() + { + //NH-3048 + var mapper = new ModelMapper(); + mapper.Class(map => map.ComponentAsId(x => x.Id, x => + { + x.UnsavedValue(UnsavedValueType.Any); + })); + + var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities(); + + Assert.AreEqual(mapping.RootClasses[0].CompositeId.unsavedvalue, HbmUnsavedValueType.Any); + } + [Test] public void WhenPropertyUsedAsComposedIdThenRegister() { diff --git a/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs b/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs index 2378f360866..72029634360 100644 --- a/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs +++ b/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs @@ -12,6 +12,8 @@ public interface IComponentAsIdAttributesMapper : IAccessorPropertyMapper /// Useful when the property is an interface and you need the mapping to a concrete class mapped as component. /// void Class(System.Type componentType); + + void UnsavedValue(UnsavedValueType unsavedValueType); } public interface IComponentAsIdMapper : IComponentAsIdAttributesMapper, IMinimalPlainPropertyContainerMapper { } @@ -21,6 +23,8 @@ public interface IComposedIdMapper : IMinimalPlainPropertyContainerMapp public interface IComponentAsIdAttributesMapper : IAccessorPropertyMapper { void Class() where TConcrete : TComponent; + + void UnsavedValue(UnsavedValueType unsavedValueType); } public interface IComponentAsIdMapper : IComponentAsIdAttributesMapper, IMinimalPlainPropertyContainerMapper diff --git a/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs index 841a1828bda..940112cf879 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs @@ -20,6 +20,11 @@ public ComponentAsIdMapper(System.Type componentType, MemberInfo declaringTypeMe accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => id.access = x); } + public void UnsavedValue(UnsavedValueType unsavedValueType) + { + id.unsavedvalue = (HbmUnsavedValueType)Enum.Parse(typeof(HbmUnsavedValueType), unsavedValueType.ToString()); + } + public HbmCompositeId CompositeId { get { return id; } diff --git a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs index 5c398b0f40f..7334a20f281 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs @@ -19,6 +19,11 @@ public ComponentAsIdCustomizer(IModelExplicitDeclarationsHolder explicitDeclarat explicitDeclarationsHolder.AddAsPoid(propertyPath.LocalMember); } + public void UnsavedValue(UnsavedValueType unsavedValueType) + { + CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.UnsavedValue(unsavedValueType)); + } + public void Class() where TConcrete : TComponent { CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.Class(typeof(TConcrete))); diff --git a/src/NHibernate/Mapping/ByCode/UnsavedValueType.cs b/src/NHibernate/Mapping/ByCode/UnsavedValueType.cs new file mode 100644 index 00000000000..0109224432b --- /dev/null +++ b/src/NHibernate/Mapping/ByCode/UnsavedValueType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Mapping.ByCode +{ + public enum UnsavedValueType + { + Undefined, + + Any, + + None, + } +} diff --git a/src/NHibernate/NHibernate.csproj b/src/NHibernate/NHibernate.csproj index 324f64e8cc3..b399d058ce9 100644 --- a/src/NHibernate/NHibernate.csproj +++ b/src/NHibernate/NHibernate.csproj @@ -498,6 +498,7 @@ +