|
From: <fab...@us...> - 2011-04-13 11:48:19
|
Revision: 5684
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5684&view=rev
Author: fabiomaulo
Date: 2011-04-13 11:48:08 +0000 (Wed, 13 Apr 2011)
Log Message:
-----------
ConventionModelMapper with convention for many-to-many key
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/ManyToManyKeyIdColumnTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-13 04:15:56 UTC (rev 5683)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-13 11:48:08 UTC (rev 5684)
@@ -19,10 +19,32 @@
BeforeMapProperty += PropertyColumnName;
BeforeMapList += ManyToManyInCollectionTable;
BeforeMapBag += ManyToManyInCollectionTable;
+ BeforeMapIdBag += ManyToManyInCollectionTable;
BeforeMapSet += ManyToManyInCollectionTable;
BeforeMapMap += ManyToManyInCollectionTable;
+
+ BeforeMapList += ManyToManyKeyIdColumn;
+ BeforeMapBag += ManyToManyKeyIdColumn;
+ BeforeMapIdBag += ManyToManyKeyIdColumn;
+ BeforeMapSet += ManyToManyKeyIdColumn;
+ BeforeMapMap += ManyToManyKeyIdColumn;
}
+ protected void ManyToManyKeyIdColumn(IModelInspector modelInspector, PropertyPath member, ICollectionPropertiesMapper collectionCustomizer)
+ {
+ System.Type propertyType = member.LocalMember.GetPropertyOrFieldType();
+
+ System.Type fromMany = member.GetContainerEntity(modelInspector);
+ System.Type toMany = propertyType.DetermineCollectionElementOrDictionaryValueType();
+ if (!modelInspector.IsEntity(toMany))
+ {
+ // does not apply when the relation is on the key of the dictionary
+ return;
+ }
+
+ collectionCustomizer.Key(km => km.Column(fromMany.Name + "Id"));
+ }
+
protected void ManyToManyInCollectionTable(IModelInspector modelInspector, PropertyPath member, ICollectionPropertiesMapper collectionCustomizer)
{
System.Type propertyType = member.LocalMember.GetPropertyOrFieldType();
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/ManyToManyKeyIdColumnTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/ManyToManyKeyIdColumnTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/ManyToManyKeyIdColumnTests.cs 2011-04-13 11:48:08 UTC (rev 5684)
@@ -0,0 +1,101 @@
+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 ManyToManyKeyIdColumnTests
+ {
+ private class MyClass
+ {
+ public int Id { get; set; }
+ public ICollection<MyBidirect> MyBidirects { get; set; }
+ public IDictionary<MyBidirect, string> MapKey { get; set; }
+ public IDictionary<string, MyBidirect> MapValue { get; set; }
+ public MyComponent MyComponent { get; set; }
+ }
+
+ private class MyComponent
+ {
+ public ICollection<MyBidirect> MyBidirects { get; set; }
+ }
+
+ private class MyBidirect
+ {
+ public int Id { get; set; }
+ public ICollection<MyClass> MyClasses { get; set; }
+ }
+
+ private HbmMapping GetModelMapping()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.Class<MyClass>(map =>
+ {
+ map.Bag(mc => mc.MyBidirects, c => { }, rel => rel.ManyToMany());
+ map.Map(mc => mc.MapKey, c => { }, mk => mk.ManyToMany(), mv => { });
+ map.Map(mc => mc.MapValue, c => { }, mk => { }, mv => mv.ManyToMany());
+ });
+ mapper.Class<MyBidirect>(map =>
+ {
+ map.Bag(mc => mc.MyClasses, c => { }, rel => rel.ManyToMany());
+ });
+ mapper.Component<MyComponent>(map =>
+ {
+ map.Bag(mc => mc.MyBidirects, c => { }, rel => rel.ManyToMany());
+ });
+ return mapper.CompileMappingFor(new[] { typeof(MyClass), typeof(MyBidirect) });
+ }
+
+ [Test]
+ public void WhenManyToManyCollectionThenApplyTableAlphabetical()
+ {
+ HbmMapping mapping = GetModelMapping();
+
+ var hbmMyClass = mapping.RootClasses.Where(x => x.Name.Contains("MyClass")).Single();
+ var hbmMyBidirect = mapping.RootClasses.Where(x => x.Name.Contains("MyBidirect")).Single();
+
+ var hbmBagMyClass = hbmMyClass.Properties.Where(p => p.Name == "MyBidirects").OfType<HbmBag>().Single();
+ var hbmBagMyBidirect = hbmMyBidirect.Properties.Where(p => p.Name == "MyClasses").OfType<HbmBag>().Single();
+
+ hbmBagMyClass.Key.column1.Should().Be("MyClassId");
+ hbmBagMyBidirect.Key.column1.Should().Be("MyBidirectId");
+ }
+
+ [Test]
+ public void WhenRelationDeclaredAsManyToManyForDictionaryKeyThenNoMatch()
+ {
+ HbmMapping mapping = GetModelMapping();
+
+ var hbmMyClass = mapping.RootClasses.Where(x => x.Name.Contains("MyClass")).Single();
+ var hbmMapKey = hbmMyClass.Properties.Where(p => p.Name == "MapKey").OfType<HbmMap>().Single();
+
+ hbmMapKey.Key.Columns.Single().name.Should().Not.Be("MyClassId");
+ }
+
+ [Test]
+ public void WhenRelationDeclaredAsManyToManyForDictionaryValueThenMatch()
+ {
+ HbmMapping mapping = GetModelMapping();
+
+ var hbmMyClass = mapping.RootClasses.Where(x => x.Name.Contains("MyClass")).Single();
+ var hbmMapValue = hbmMyClass.Properties.Where(p => p.Name == "MapValue").OfType<HbmMap>().Single();
+
+ hbmMapValue.Key.column1.Should().Be("MyClassId");
+ }
+
+ [Test]
+ public void WhenManyToManyCollectionInsideComponentThenApplyFromEntityToEntity()
+ {
+ HbmMapping mapping = GetModelMapping();
+
+ var hbmMyClass = mapping.RootClasses.Where(x => x.Name.Contains("MyClass")).Single();
+ var hbmMyComponent = hbmMyClass.Properties.Where(p => p.Name == "MyComponent").OfType<HbmComponent>().Single();
+ var hbmBagMyClass = hbmMyComponent.Properties.Where(p => p.Name == "MyBidirects").OfType<HbmBag>().Single();
+
+ hbmBagMyClass.Key.column1.Should().Be("MyClassId");
+ }
+ }
+}
\ 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-13 04:15:56 UTC (rev 5683)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-13 11:48:08 UTC (rev 5684)
@@ -513,6 +513,7 @@
<Compile Include="Logging\LoggerProviderTest.cs" />
<Compile Include="MappingByCode\ConventionModelMapperTests\JoinedSubclassKeyAsRootIdColumnTest.cs" />
<Compile Include="MappingByCode\ConventionModelMapperTests\ManyToManyInCollectionTableTests.cs" />
+ <Compile Include="MappingByCode\ConventionModelMapperTests\ManyToManyKeyIdColumnTests.cs" />
<Compile Include="MappingByCode\ConventionModelMapperTests\PropertyColumnNameTests.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\BagOfNestedComponentsWithParentTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|