|
From: <fab...@us...> - 2011-04-12 18:38:03
|
Revision: 5680
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5680&view=rev
Author: fabiomaulo
Date: 2011-04-12 18:37:57 +0000 (Tue, 12 Apr 2011)
Log Message:
-----------
ConventionModelMapper with convention for property column
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-12 17:55:24 UTC (rev 5679)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-12 18:37:57 UTC (rev 5680)
@@ -16,8 +16,24 @@
protected virtual void AppendDefaultEvents()
{
BeforeMapJoinedSubclass += JoinedSubclassKeyAsRootIdColumn;
+ BeforeMapProperty += PropertyColumnName;
}
+ protected void PropertyColumnName(IModelInspector modelInspector, PropertyPath member, IPropertyMapper propertyCustomizer)
+ {
+ if (member.PreviousPath == null || member.LocalMember == null)
+ {
+ return;
+ }
+ if (member.PreviousPath.LocalMember.GetPropertyOrFieldType().IsGenericCollection())
+ {
+ return;
+ }
+
+ var pathToMap = member.DepureFirstLevelIfCollection();
+ propertyCustomizer.Column(pathToMap.ToColumnName());
+ }
+
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()));
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs 2011-04-12 17:55:24 UTC (rev 5679)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs 2011-04-12 18:37:57 UTC (rev 5680)
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
namespace NHibernate.Mapping.ByCode
@@ -43,5 +44,19 @@
analizing = analizing.PreviousPath;
} while (analizing != null);
}
+
+ public static PropertyPath DepureFirstLevelIfCollection(this PropertyPath source)
+ {
+ // when the component is used as elements of a collection, the name of the property representing
+ // the collection itself may be ignored since each collection will have its own table.
+ // Note: In some cases may be a problem.
+ const int penultimateOffset = 2;
+ if (!source.GetRootMember().GetPropertyOrFieldType().IsGenericCollection())
+ {
+ return source;
+ }
+ var paths = source.InverseProgressivePath().ToArray();
+ return paths[paths.Length - penultimateOffset];
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-12 17:55:24 UTC (rev 5679)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-12 18:37:57 UTC (rev 5680)
@@ -48,7 +48,7 @@
isTablePerClass = (t, declared) => declared || MatchTablePerClass(t);
isPersistentId = (m, declared) => declared || MatchPoIdPattern(m);
isComponent = (t, declared) => declared || MatchComponentPattern(t);
- isPersistentProperty = (m, declared) => declared || MatchNoReadOnlyPropertyPattern(m);
+ isPersistentProperty = (m, declared) => declared || ((m is PropertyInfo) && MatchNoReadOnlyPropertyPattern(m));
isSet = (m, declared) => declared || MatchCollection(m, MatchSetMember);
isArray = (m, declared) => declared || MatchCollection(m, MatchArrayMember);
isBag = (m, declared) => declared || MatchCollection(m, MatchBagMember);
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs 2011-04-12 18:37:57 UTC (rev 5680)
@@ -0,0 +1,63 @@
+using System.Collections.Generic;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ConventionModelMapperTests
+{
+ public class PropertyColumnNameTests
+ {
+ private class MyClass
+ {
+ public int Id { get; set; }
+ public string Fake1 { get; set; }
+ }
+
+ private class MyClassWithComponent
+ {
+ public int Id { get; set; }
+ public MyComponent Component1 { get; set; }
+ public IEnumerable<MyComponent> Components { get; set; }
+ }
+
+ private class MyComponent
+ {
+ public string Fake0 { get; set; }
+ }
+
+ [Test]
+ public void WhenAtClassLevelThenNoMatch()
+ {
+ var mapper = new ConventionModelMapper();
+ var mapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = mapping.RootClasses[0];
+ var hbmProperty = hbmClass.Properties.OfType<HbmProperty>().Single(x => x.Name == "Fake1");
+ hbmProperty.Columns.Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenFirstLevelIsCollectionThenNoMatch()
+ {
+ var mapper = new ConventionModelMapper();
+ var mapping = mapper.CompileMappingFor(new[] { typeof(MyClassWithComponent) });
+ var hbmClass = mapping.RootClasses[0];
+ var hbmBag = hbmClass.Properties.OfType<HbmBag>().Single(x => x.Name == "Components");
+ var hbmCompositeElement = (HbmCompositeElement) hbmBag.ElementRelationship;
+ var hbmProperty = hbmCompositeElement.Properties.OfType<HbmProperty>().Single(x => x.Name == "Fake0");
+ hbmProperty.Columns.Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenAtComponentLevelThenMatch()
+ {
+ var mapper = new ConventionModelMapper();
+ var mapping = mapper.CompileMappingFor(new[] { typeof(MyClassWithComponent) });
+ var hbmClass = mapping.RootClasses[0];
+ var hbmComponent = hbmClass.Properties.OfType<HbmComponent>().Single();
+ var hbmProperty = hbmComponent.Properties.OfType<HbmProperty>().Single(x => x.Name == "Fake0");
+ hbmProperty.Columns.Single().name.Should().Be("Component1Fake0");
+ }
+ }
+}
\ 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 17:55:24 UTC (rev 5679)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-12 18:37:57 UTC (rev 5680)
@@ -512,6 +512,7 @@
<Compile Include="Logging\Log4NetLoggerTest.cs" />
<Compile Include="Logging\LoggerProviderTest.cs" />
<Compile Include="MappingByCode\ConventionModelMapperTests\JoinedSubclassKeyAsRootIdColumnTest.cs" />
+ <Compile Include="MappingByCode\ConventionModelMapperTests\PropertyColumnNameTests.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.
|