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. |