From: <fab...@us...> - 2011-04-10 21:14:36
|
Revision: 5659 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5659&view=rev Author: fabiomaulo Date: 2011-04-10 21:14:30 +0000 (Sun, 10 Apr 2011) Log Message: ----------- SimpleModelInspector with default pattern to discover ManyToOne 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/ManyToOneTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 20:48:38 UTC (rev 5658) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 21:14:30 UTC (rev 5659) @@ -29,7 +29,7 @@ private Func<MemberInfo, bool, bool> isProperty = (m, declared) => declared; private Func<MemberInfo, bool, bool> isAny = (m, declared) => declared; private Func<MemberInfo, bool, bool> isManyToMany = (m, declared) => declared; - private Func<MemberInfo, bool, bool> isManyToOne = (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> isOneToOne = (m, declared) => declared; @@ -50,8 +50,20 @@ isArray = (m, declared) => declared || MatchCollection(m, MatchArrayMember); isBag = (m, declared) => declared || MatchCollection(m, MatchBagMember); isDictionary = (m, declared) => declared || MatchCollection(m, MatchDictionaryMember); + isManyToOne = (m, declared) => declared || MatchManyToOne(m); } + private bool MatchManyToOne(MemberInfo memberInfo) + { + var modelInspector = (IModelInspector)this; + System.Type from = memberInfo.ReflectedType; + System.Type to = memberInfo.GetPropertyOrFieldType(); + + bool areEntities = modelInspector.IsEntity(from) && modelInspector.IsEntity(to); + bool isFromComponentToEntity = modelInspector.IsComponent(from) && modelInspector.IsEntity(to); + return isFromComponentToEntity || (areEntities && !modelInspector.IsOneToOne(memberInfo)); + } + protected bool MatchArrayMember(MemberInfo subject) { System.Type memberType = subject.GetPropertyOrFieldType(); Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/ManyToOneTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/ManyToOneTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/ManyToOneTest.cs 2011-04-10 21:14:30 UTC (rev 5659) @@ -0,0 +1,63 @@ +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MixAutomapping +{ + public class ManyToOneTest + { + private class AEntity + { + public int Id { get; set; } + public BEntity B { get; set; } + public string Name { get; set; } + } + + private class BEntity + { + public int Id { get; set; } + } + + [Test] + public void WhenRelationWithTwoEntityThenIsManyToOne() + { + var autoinspector = new SimpleModelInspector(); + autoinspector.IsEntity((t, declared) => typeof(AEntity).Equals(t) || typeof(BEntity).Equals(t)); + + var inspector = (IModelInspector)autoinspector; + inspector.IsManyToOne(typeof(AEntity).GetProperty("B")).Should().Be.True(); + } + + [Test] + public void WhenSimplePropertyThenIsNotManyToOne() + { + var autoinspector = new SimpleModelInspector(); + autoinspector.IsEntity((t, declared) => typeof(AEntity).Equals(t) || typeof(BEntity).Equals(t)); + + var inspector = (IModelInspector)autoinspector; + inspector.IsManyToOne(typeof(AEntity).GetProperty("Name")).Should().Be.False(); + } + + [Test] + public void WhenRelatedMatchComponentThenIsNotManyToOne() + { + var autoinspector = new SimpleModelInspector(); + autoinspector.IsEntity((t, declared) => typeof(AEntity).Equals(t)); + autoinspector.IsComponent((t, declared) => typeof(BEntity).Equals(t)); + + var inspector = (IModelInspector)autoinspector; + inspector.IsManyToOne(typeof(AEntity).GetProperty("B")).Should().Be.False(); + } + + [Test] + public void WhenRelatedDeclaredAsOneToOneThenIsNotManyToOne() + { + var autoinspector = new SimpleModelInspector(); + var mapper = new ModelMapper(autoinspector); + mapper.Class<AEntity>(map => map.OneToOne(a => a.B, x => { })); + mapper.Class<BEntity>(x=> { }); + var inspector = (IModelInspector)autoinspector; + inspector.IsManyToOne(typeof(AEntity).GetProperty("B")).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 20:48:38 UTC (rev 5658) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-10 21:14:30 UTC (rev 5659) @@ -545,6 +545,7 @@ <Compile Include="MappingByCode\MixAutomapping\BagCollectionTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\ComponentsTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\DictionaryCollectionTests.cs" /> + <Compile Include="MappingByCode\MixAutomapping\ManyToOneTest.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. |