|
From: <fab...@us...> - 2011-04-12 17:50:40
|
Revision: 5678
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5678&view=rev
Author: fabiomaulo
Date: 2011-04-12 17:50:33 +0000 (Tue, 12 Apr 2011)
Log Message:
-----------
ConventionModelMapper with convention for joined-subclass key column
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-12 17:50:33 UTC (rev 5678)
@@ -0,0 +1,155 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+
+namespace NHibernate.Mapping.ByCode
+{
+ public class ConventionModelMapper : ModelMapper
+ {
+ public ConventionModelMapper()
+ : base(new SimpleModelInspector())
+ {
+ AppendDefaultEvents();
+ }
+
+ protected virtual void AppendDefaultEvents()
+ {
+ BeforeMapJoinedSubclass += JoinedSubclassKeyAsRootIdColumn;
+ }
+
+ protected void JoinedSubclassKeyAsRootIdColumn(IModelInspector modelInspector, System.Type type, IJoinedSubclassAttributesMapper joinedSubclassCustomizer)
+ {
+ var idMember = type.GetProperties().Cast<MemberInfo>().Concat(type.GetFields()).FirstOrDefault(mi => ModelInspector.IsPersistentId(mi.GetMemberFromDeclaringType()));
+ if (idMember != null)
+ {
+ joinedSubclassCustomizer.Key(km => km.Column(idMember.Name));
+ }
+ }
+
+ protected SimpleModelInspector SimpleModelInspector
+ {
+ get { return (SimpleModelInspector) base.ModelInspector; }
+ }
+
+ public void IsRootEntity(Func<System.Type, bool, bool> match)
+ {
+ SimpleModelInspector.IsRootEntity(match);
+ }
+
+ public void IsComponent(Func<System.Type, bool, bool> match)
+ {
+ SimpleModelInspector.IsComponent(match);
+ }
+
+ public void IsEntity(Func<System.Type, bool, bool> match)
+ {
+ SimpleModelInspector.IsEntity(match);
+ }
+
+ public void IsTablePerClass(Func<System.Type, bool, bool> match)
+ {
+ SimpleModelInspector.IsTablePerClass(match);
+ }
+
+ public void IsTablePerClassHierarchy(Func<System.Type, bool, bool> match)
+ {
+ SimpleModelInspector.IsTablePerClassHierarchy(match);
+ }
+
+ public void IsTablePerConcreteClass(Func<System.Type, bool, bool> match)
+ {
+ SimpleModelInspector.IsTablePerConcreteClass(match);
+ }
+
+ public void IsOneToOne(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsOneToOne(match);
+ }
+
+ public void IsManyToOne(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsManyToOne(match);
+ }
+
+ public void IsManyToMany(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsManyToMany(match);
+ }
+
+ public void IsOneToMany(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsOneToMany(match);
+ }
+
+ public void IsAny(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsAny(match);
+ }
+
+ public void IsPersistentId(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsPersistentId(match);
+ }
+
+ public void IsVersion(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsVersion(match);
+ }
+
+ public void IsMemberOfNaturalId(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsMemberOfNaturalId(match);
+ }
+
+ public void IsPersistentProperty(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsPersistentProperty(match);
+ }
+
+ public void IsSet(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsSet(match);
+ }
+
+ public void IsBag(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsBag(match);
+ }
+
+ public void IsIdBag(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsIdBag(match);
+ }
+
+ public void IsList(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsList(match);
+ }
+
+ public void IsArray(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsArray(match);
+ }
+
+ public void IsDictionary(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsDictionary(match);
+ }
+
+ public void IsProperty(Func<MemberInfo, bool, bool> match)
+ {
+ SimpleModelInspector.IsProperty(match);
+ }
+
+ public void SplitsFor(Func<System.Type, IEnumerable<string>, IEnumerable<string>> getPropertiesSplitsId)
+ {
+ SimpleModelInspector.SplitsFor(getPropertiesSplitsId);
+ }
+
+ public void IsTablePerClassSplit(Func<SplitDefinition, bool, bool> match)
+ {
+ SimpleModelInspector.IsTablePerClassSplit(match);
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-12 14:27:47 UTC (rev 5677)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-12 17:50:33 UTC (rev 5678)
@@ -438,6 +438,7 @@
<Compile Include="Mapping\Column.cs" />
<Compile Include="Mapping\Component.cs" />
<Compile Include="Mapping\Constraint.cs" />
+ <Compile Include="Mapping\ByCode\ConventionModelMapper.cs" />
<Compile Include="Mapping\ForeignKey.cs" />
<Compile Include="Mapping\Formula.cs" />
<Compile Include="Mapping\IdentifierBag.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs 2011-04-12 17:50:33 UTC (rev 5678)
@@ -0,0 +1,53 @@
+using System.Linq;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ConventionModelMapperTests
+{
+ public class JoinedSubclassKeyAsRootIdColumnTest
+ {
+ private class MyClass
+ {
+ public int MyId { get; set; }
+ public int HisId { get; set; }
+ }
+
+ private class Inherited : MyClass
+ {
+ }
+
+ [Test]
+ public void WhenBaseIsIdThenUseId()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.Class<MyClass>(map=> map.Id(x=> x.MyId));
+ var mapping = mapper.CompileMappingFor(new[] { typeof(Inherited), typeof(MyClass) });
+ var hbmJoinedClass = mapping.JoinedSubclasses[0];
+
+ hbmJoinedClass.key.Columns.Single().name.Should().Be("MyId");
+ }
+
+ [Test]
+ public void WhenBaseIsPoIdThenUsePoId()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.Class<MyClass>(map => map.Id(x => x.HisId));
+ var mapping = mapper.CompileMappingFor(new[] { typeof(Inherited), typeof(MyClass) });
+ var hbmJoinedClass = mapping.JoinedSubclasses[0];
+
+ hbmJoinedClass.key.Columns.Single().name.Should().Be("HisId");
+ }
+
+ [Test]
+ public void WhenNoPoidMemberThenDoesNotSet()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.Class<MyClass>(map => { });
+ var mapping = mapper.CompileMappingFor(new[] { typeof(Inherited), typeof(MyClass) });
+ var hbmJoinedClass = mapping.JoinedSubclasses[0];
+
+ hbmJoinedClass.key.Columns.Single().name.Should().Not.Be("MyId").And.Not.Be("HisId");
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-12 14:27:47 UTC (rev 5677)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-12 17:50:33 UTC (rev 5678)
@@ -511,6 +511,7 @@
<Compile Include="Linq\ByMethod\SumTests.cs" />
<Compile Include="Logging\Log4NetLoggerTest.cs" />
<Compile Include="Logging\LoggerProviderTest.cs" />
+ <Compile Include="MappingByCode\ConventionModelMapperTests\JoinedSubclassKeyAsRootIdColumnTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\BagOfNestedComponentsWithParentTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ClassMappingRegistrationTest.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|