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