|
From: <fab...@us...> - 2011-04-22 15:07:36
|
Revision: 5737
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5737&view=rev
Author: fabiomaulo
Date: 2011-04-22 15:07:29 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
DynamicComponentMapper set property type by default and ignore accessor setting
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 14:14:26 UTC (rev 5736)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 15:07:29 UTC (rev 5737)
@@ -26,6 +26,18 @@
component.Items = component.Items == null ? toAdd : component.Items.Concat(toAdd).ToArray();
}
+ public override void Property(MemberInfo property, Action<IPropertyMapper> mapping)
+ {
+ var hbmProperty = new HbmProperty
+ {
+ name = property.Name,
+ type1 = property.GetPropertyOrFieldType().GetNhTypeName()
+ };
+
+ mapping(new PropertyMapper(property, hbmProperty, new NoMemberPropertyMapper()));
+ AddProperty(hbmProperty);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-04-22 14:14:26 UTC (rev 5736)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-04-22 15:07:29 UTC (rev 5737)
@@ -14,6 +14,21 @@
private readonly MemberInfo member;
private readonly HbmProperty propertyMapping;
+ public PropertyMapper(MemberInfo member, HbmProperty propertyMapping, IAccessorPropertyMapper accessorMapper)
+ {
+ if (propertyMapping == null)
+ {
+ throw new ArgumentNullException("propertyMapping");
+ }
+ this.member = member;
+ this.propertyMapping = propertyMapping;
+ if (member == null)
+ {
+ this.propertyMapping.access = "none";
+ }
+ entityPropertyMapper = accessorMapper;
+ }
+
public PropertyMapper(MemberInfo member, HbmProperty propertyMapping)
{
if (propertyMapping == null)
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 14:14:26 UTC (rev 5736)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 15:07:29 UTC (rev 5737)
@@ -32,5 +32,21 @@
hbmDynamicComponent.Should().Not.Be.Null();
hbmDynamicComponent.Properties.Select(x=> x.Name).Should().Have.SameValuesAs("MyInt", "MyDate");
}
+
+ [Test]
+ public void WhenMapDynCompoPropertiesThenShouldAssignPropertyType()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<Person>(map =>
+ {
+ map.Id(x => x.Id, idmap => { });
+ map.Component(x => x.Info, new { MyInt = 5, MyDate = DateTime.Now }, z => { });
+ });
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(Person) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().Single();
+ hbmDynamicComponent.Properties.OfType<HbmProperty>().Select(x => x.type1).All(x=> x.Satisfy(value=> !string.IsNullOrEmpty(value)));
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs 2011-04-22 15:07:29 UTC (rev 5737)
@@ -0,0 +1,458 @@
+using System;
+using System.Linq;
+using System.Data;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Engine;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NHibernate.Properties;
+using NHibernate.SqlTypes;
+using NHibernate.Type;
+using NHibernate.UserTypes;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests
+{
+ public class PropertyMapperTest
+ {
+ private enum MyEnum
+ {
+ One
+ }
+ private class MyClass
+ {
+ public string Autoproperty { get; set; }
+ public string ReadOnly { get { return ""; } }
+ public MyEnum EnumProp { get; set; }
+ }
+
+ private class MyAccessorMapper : IAccessorPropertyMapper
+ {
+ public bool AccessorCalled { get; set; }
+ public void Access(Accessor accessor)
+ {
+ AccessorCalled = true;
+ }
+
+ public void Access(System.Type accessorType)
+ {
+
+ }
+ }
+ [Test]
+ public void WhenCreateWithGivenAccessorMapperThenUseTheGivenAccessoMapper()
+ {
+ var member = typeof (MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var myAccessorMapper = new MyAccessorMapper();
+ var mapper = new PropertyMapper(member, mapping, myAccessorMapper);
+ mapper.Access(Accessor.Field);
+ myAccessorMapper.AccessorCalled.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenSettingByTypeThenCheckCompatibility()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+
+ Executing.This(() => mapper.Access(typeof(object))).Should().Throw<ArgumentOutOfRangeException>();
+ Executing.This(() => mapper.Access(typeof(FieldAccessor))).Should().NotThrow();
+ mapping.Access.Should().Be.EqualTo(typeof(FieldAccessor).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WhenSetTypeByITypeThenSetTypeName()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Type(NHibernateUtil.String);
+
+ mapping.Type.name.Should().Be.EqualTo("String");
+ }
+
+ [Test]
+ public void WhenSetTypeByIUserTypeThenSetTypeName()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Type<MyType>();
+
+ mapping.Type.name.Should().Contain("MyType");
+ mapping.type.Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenSetTypeByICompositeUserTypeThenSetTypeName()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Type<MyCompoType>();
+
+ mapping.Type.name.Should().Contain("MyCompoType");
+ mapping.type.Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenSetTypeByIUserTypeWithParamsThenSetType()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Type<MyType>(new { Param1 = "a", Param2 = 12 });
+
+ mapping.type1.Should().Be.Null();
+ mapping.Type.name.Should().Contain("MyType");
+ mapping.Type.param.Should().Have.Count.EqualTo(2);
+ mapping.Type.param.Select(p => p.name).Should().Have.SameValuesAs("Param1", "Param2");
+ mapping.Type.param.Select(p => p.GetText()).Should().Have.SameValuesAs("a", "12");
+ }
+
+ [Test]
+ public void WhenSetTypeByIUserTypeWithNullParamsThenSetTypeName()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Type<MyType>(null);
+
+ mapping.Type.name.Should().Contain("MyType");
+ mapping.type.Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenSetTypeByITypeTypeThenSetType()
+ {
+ var member = For<MyClass>.Property(c => c.EnumProp);
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Type<EnumStringType<MyEnum>>();
+
+ mapping.Type.name.Should().Contain(typeof(EnumStringType<MyEnum>).FullName);
+ mapping.type.Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenSetInvalidTypeThenThrow()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ Executing.This(() => mapper.Type(typeof(object), null)).Should().Throw<ArgumentOutOfRangeException>();
+ Executing.This(() => mapper.Type(null, null)).Should().Throw<ArgumentNullException>();
+ }
+
+ [Test]
+ public void WhenSetDifferentColumnNameThenSetTheName()
+ {
+ var member = typeof(MyClass).GetProperty("Autoproperty");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Column(cm => cm.Name("pepe"));
+
+ mapping.Columns.Should().Have.Count.EqualTo(1);
+ mapping.Columns.Single().name.Should().Be("pepe");
+ }
+
+ [Test]
+ public void WhenSetDefaultColumnNameThenDoesNotSetTheName()
+ {
+ var member = typeof(MyClass).GetProperty("Autoproperty");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Column(cm => { cm.Name("Autoproperty"); cm.Length(50); });
+ mapping.column.Should().Be.Null();
+ mapping.length.Should().Be("50");
+ mapping.Columns.Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenSetBasicColumnValuesThenSetPlainValues()
+ {
+ var member = typeof(MyClass).GetProperty("Autoproperty");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Column(cm =>
+ {
+ cm.Length(50);
+ cm.NotNullable(true);
+ });
+ mapping.Items.Should().Be.Null();
+ mapping.length.Should().Be("50");
+ mapping.notnull.Should().Be(true);
+ mapping.notnullSpecified.Should().Be(true);
+ }
+
+ [Test]
+ public void WhenSetColumnValuesThenAddColumnTag()
+ {
+ var member = typeof(MyClass).GetProperty("Autoproperty");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Column(cm =>
+ {
+ cm.SqlType("VARCHAR(50)");
+ cm.NotNullable(true);
+ });
+ mapping.Items.Should().Not.Be.Null();
+ mapping.Columns.Should().Have.Count.EqualTo(1);
+ }
+
+ [Test]
+ public void WhenSetBasicColumnValuesMoreThanOnesThenMergeColumn()
+ {
+ var member = typeof(MyClass).GetProperty("Autoproperty");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Column(cm => cm.Length(50));
+ mapper.Column(cm => cm.NotNullable(true));
+
+ mapping.Items.Should().Be.Null();
+ mapping.length.Should().Be("50");
+ mapping.notnull.Should().Be(true);
+ mapping.notnullSpecified.Should().Be(true);
+ }
+
+ [Test]
+ public void WhenSetMultiColumnsValuesThenAddColumns()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Type<MyType>();
+ mapper.Columns(cm =>
+ {
+ cm.Name("column1");
+ cm.Length(50);
+ }, cm =>
+ {
+ cm.Name("column2");
+ cm.SqlType("VARCHAR(10)");
+ });
+ mapping.Columns.Should().Have.Count.EqualTo(2);
+ }
+
+ [Test]
+ public void WhenSetMultiColumnsValuesThenAutoassignColumnNames()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Columns(cm => cm.Length(50), cm => cm.SqlType("VARCHAR(10)"));
+ mapping.Columns.Should().Have.Count.EqualTo(2);
+ mapping.Columns.All(cm => cm.name.Satisfy(n => !string.IsNullOrEmpty(n)));
+ }
+
+ [Test]
+ public void AfterSetMultiColumnsCantSetSimpleColumn()
+ {
+ var member = typeof(MyClass).GetProperty("ReadOnly");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Columns(cm => cm.Length(50), cm => cm.SqlType("VARCHAR(10)"));
+ Executing.This(() => mapper.Column(cm => cm.Length(50))).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenSetBasicColumnValuesThroughShortCutThenMergeColumn()
+ {
+ var member = typeof(MyClass).GetProperty("Autoproperty");
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+ mapper.Column("pizza");
+ mapper.Length(50);
+ mapper.Precision(10);
+ mapper.Scale(2);
+ mapper.NotNullable(true);
+ mapper.Unique(true);
+ mapper.UniqueKey("AA");
+ mapper.Index("II");
+
+ mapping.Items.Should().Be.Null();
+ mapping.column.Should().Be("pizza");
+ mapping.length.Should().Be("50");
+ mapping.precision.Should().Be("10");
+ mapping.scale.Should().Be("2");
+ mapping.notnull.Should().Be(true);
+ mapping.unique.Should().Be(true);
+ mapping.uniquekey.Should().Be("AA");
+ mapping.index.Should().Be("II");
+ }
+
+ [Test]
+ public void WhenSetUpdateThenSetAttributes()
+ {
+ var member = For<MyClass>.Property(x => x.ReadOnly);
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+
+ mapper.Update(false);
+ mapping.update.Should().Be.False();
+ mapping.updateSpecified.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenSetInsertThenSetAttributes()
+ {
+ var member = For<MyClass>.Property(x => x.ReadOnly);
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+
+ mapper.Insert(false);
+ mapping.insert.Should().Be.False();
+ mapping.insertSpecified.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenSetLazyThenSetAttributes()
+ {
+ var member = For<MyClass>.Property(x => x.ReadOnly);
+ var mapping = new HbmProperty();
+ var mapper = new PropertyMapper(member, mapping);
+
+ mapper.Lazy(true);
+ mapping.lazy.Should().Be.True();
+ mapping.IsLazyProperty.Should().Be.True();
+ }
+ }
+
+ public class MyType : IUserType
+ {
+ #region Implementation of IUserType
+
+ public bool Equals(object x, object y)
+ {
+ throw new NotImplementedException();
+ }
+
+ public int GetHashCode(object x)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object NullSafeGet(IDataReader rs, string[] names, object owner)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void NullSafeSet(IDbCommand cmd, object value, int index)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object DeepCopy(object value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object Replace(object original, object target, object owner)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object Assemble(object cached, object owner)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object Disassemble(object value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public SqlType[] SqlTypes
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ public System.Type ReturnedType
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ public bool IsMutable
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ #endregion
+ }
+
+ public class MyCompoType : ICompositeUserType
+ {
+ public object GetPropertyValue(object component, int property)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void SetPropertyValue(object component, int property, object value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool Equals(object x, object y)
+ {
+ throw new NotImplementedException();
+ }
+
+ public int GetHashCode(object x)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object DeepCopy(object value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object Disassemble(object value, ISessionImplementor session)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object Assemble(object cached, ISessionImplementor session, object owner)
+ {
+ throw new NotImplementedException();
+ }
+
+ public object Replace(object original, object target, ISessionImplementor session, object owner)
+ {
+ throw new NotImplementedException();
+ }
+
+ public string[] PropertyNames
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ public IType[] PropertyTypes
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ public System.Type ReturnedClass
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ public bool IsMutable
+ {
+ get { throw new NotImplementedException(); }
+ }
+ }
+}
\ 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-22 14:14:26 UTC (rev 5736)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 15:07:29 UTC (rev 5737)
@@ -557,6 +557,7 @@
<Compile Include="MappingByCode\MappersTests\JoinedSubclassMapperTests\SetPersisterTests.cs" />
<Compile Include="MappingByCode\MappersTests\JoinedSubclassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\JoinMapperTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\PropertyMapperTest.cs" />
<Compile Include="MappingByCode\MappersTests\SubclassMapperTests\SetPersisterTests.cs" />
<Compile Include="MappingByCode\MappersTests\SubclassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\SubclassMapperWithJoinPropertiesTest.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|