From: <fab...@us...> - 2011-04-10 21:56:04
|
Revision: 5660 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5660&view=rev Author: fabiomaulo Date: 2011-04-10 21:55:57 +0000 (Sun, 10 Apr 2011) Log Message: ----------- SimpleModelInspector with default pattern to discover OneToMany properties Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/OneToManyTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 21:14:30 UTC (rev 5659) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 21:55:57 UTC (rev 5660) @@ -31,7 +31,7 @@ private Func<MemberInfo, bool, bool> isManyToMany = (m, declared) => declared; private Func<MemberInfo, bool, bool> isManyToOne; private Func<MemberInfo, bool, bool> isMemberOfNaturalId = (m, declared) => declared; - private Func<MemberInfo, bool, bool> isOneToMany = (m, declared) => declared; + private Func<MemberInfo, bool, bool> isOneToMany; private Func<MemberInfo, bool, bool> isOneToOne = (m, declared) => declared; private Func<MemberInfo, bool, bool> isSet; @@ -51,8 +51,24 @@ isBag = (m, declared) => declared || MatchCollection(m, MatchBagMember); isDictionary = (m, declared) => declared || MatchCollection(m, MatchDictionaryMember); isManyToOne = (m, declared) => declared || MatchManyToOne(m); + isOneToMany = (m, declared) => declared || MatchOneToMany(m); } + private bool MatchOneToMany(MemberInfo memberInfo) + { + var modelInspector = (IModelInspector) this; + System.Type from = memberInfo.ReflectedType; + System.Type to = memberInfo.GetPropertyOrFieldType().DetermineCollectionElementOrDictionaryValueType(); + if(to == null) + { + // no generic collection or simple property + return false; + } + bool areEntities = modelInspector.IsEntity(from) && modelInspector.IsEntity(to); + bool isFromComponentToEntity = modelInspector.IsComponent(from) && modelInspector.IsEntity(to); + return !declaredModel.IsManyToMany(memberInfo) && (areEntities || isFromComponentToEntity); + } + private bool MatchManyToOne(MemberInfo memberInfo) { var modelInspector = (IModelInspector)this; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/OneToManyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/OneToManyTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/OneToManyTests.cs 2011-04-10 21:55:57 UTC (rev 5660) @@ -0,0 +1,138 @@ +using System.Collections.Generic; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MixAutomapping +{ + public class OneToManyTests + { + private class MyClass + { + public string Something { get; set; } + public IEnumerable<Related> Relateds { get; set; } + public IEnumerable<Bidirectional> Children { get; set; } + public IEnumerable<Component> Components { get; set; } + public IEnumerable<string> Elements { get; set; } + public IDictionary<string, Related> DicRelateds { get; set; } + public IDictionary<string, Bidirectional> DicChildren { get; set; } + } + + private class Related + { + + } + + private class Bidirectional + { + public MyClass MyClass { get; set; } + } + + private class Component + { + } + + private IModelInspector GetConfiguredInspector() + { + var autoinspector = new SimpleModelInspector(); + var mapper = new ModelMapper(autoinspector); + mapper.Class<MyClass>(x => { }); + mapper.Class<Related>(x => { }); + mapper.Class<Bidirectional>(x => { }); + return autoinspector; + } + + [Test] + public void WhenNoCollectionPropertyThenNoMatch() + { + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.Something); + + var inspector = GetConfiguredInspector(); + inspector.IsOneToMany(pi).Should().Be.False(); + } + + [Test] + public void WhenCollectionOfComponentsThenNoMatch() + { + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.Components); + + var inspector = GetConfiguredInspector(); + inspector.IsOneToMany(pi).Should().Be.False(); + } + + [Test] + public void WhenCollectionBidirectionalThenMatch() + { + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.Children); + + var inspector = GetConfiguredInspector(); + inspector.IsOneToMany(pi).Should().Be.True(); + } + + [Test] + public void WhenCollectionOfElementsThenNoMatch() + { + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.Elements); + + var inspector = GetConfiguredInspector(); + inspector.IsOneToMany(pi).Should().Be.False(); + } + + [Test] + public void WhenCollectionUnidirectionalThenMatch() + { + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.Relateds); + + var inspector = GetConfiguredInspector(); + inspector.IsOneToMany(pi).Should().Be.True(); + } + + [Test] + public void WhenDictionaryBidirectionalThenMatch() + { + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.DicChildren); + + var inspector = GetConfiguredInspector(); + inspector.IsOneToMany(pi).Should().Be.True(); + } + + [Test] + public void WhenDictionaryUnidirectionalThenMatch() + { + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.DicRelateds); + + var inspector = GetConfiguredInspector(); + inspector.IsOneToMany(pi).Should().Be.True(); + } + + [Test] + public void WhenCollectionUnidirectionalDeclaredManyToManyThenNoMatch() + { + var autoinspector = new SimpleModelInspector(); + var mapper = new ModelMapper(autoinspector); + mapper.Class<MyClass>(map => map.Bag(x => x.Relateds, cm => { }, relMap => relMap.ManyToMany())); + mapper.Class<Related>(x => { }); + mapper.Class<Bidirectional>(x => { }); + var inspector = (IModelInspector) autoinspector; + + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.Relateds); + + inspector.IsOneToMany(pi).Should().Be.False(); + } + + [Test] + public void WhenDictionaryUnidirectionalDeclaredManyToManyThenNoMatch() + { + var autoinspector = new SimpleModelInspector(); + var mapper = new ModelMapper(autoinspector); + mapper.Class<MyClass>(map => map.Bag(x => x.DicRelateds, cm => { }, relMap => relMap.ManyToMany())); + mapper.Class<Related>(x => { }); + mapper.Class<Bidirectional>(x => { }); + var inspector = (IModelInspector)autoinspector; + + var pi = Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(x => x.DicRelateds); + + inspector.IsOneToMany(pi).Should().Be.False(); + } + } +} \ 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-10 21:14:30 UTC (rev 5659) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-10 21:55:57 UTC (rev 5660) @@ -546,6 +546,7 @@ <Compile Include="MappingByCode\MixAutomapping\ComponentsTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\DictionaryCollectionTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\ManyToOneTest.cs" /> + <Compile Include="MappingByCode\MixAutomapping\OneToManyTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\PoidTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\PropertiesExclusionTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\SetCollectionTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |