|
From: <fab...@us...> - 2011-04-20 21:59:30
|
Revision: 5730
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5730&view=rev
Author: fabiomaulo
Date: 2011-04-20 21:59:24 +0000 (Wed, 20 Apr 2011)
Log Message:
-----------
Entities and Component mappers supporting dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-20 21:46:13 UTC (rev 5729)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-20 21:59:24 UTC (rev 5730)
@@ -68,7 +68,9 @@
{
throw new ArgumentOutOfRangeException("property", "Can't add a property of another graph");
}
- throw new NotImplementedException();
+ var hbm = new HbmDynamicComponent { name = property.Name };
+ mapping(new DynamicComponentMapper(hbm, property, MapDoc));
+ AddProperty(hbm);
}
public virtual void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping)
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs 2011-04-20 21:46:13 UTC (rev 5729)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs 2011-04-20 21:59:24 UTC (rev 5730)
@@ -1,7 +1,9 @@
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Linq;
using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Impl;
using NUnit.Framework;
using SharpTestsEx;
@@ -31,6 +33,10 @@
{
public IDictionary<string, string> Dictionary { get; set; }
}
+ private class MyClassWithDynamic
+ {
+ public IDictionary DynCompo { get; set; }
+ }
[Test]
public void CantCreateWithoutHbmMapping()
@@ -111,6 +117,25 @@
elementRelationCalled.Should().Be.True();
}
+ [Test]
+ public void AddDynamicComponentProperty()
+ {
+ var properties = new List<object>();
+ var map = new StubPropertyContainerMapper<MyClassWithDynamic>(properties);
+ map.Component(For<MyClassWithDynamic>.Property(x => x.DynCompo), (IDynamicComponentMapper cp) => { });
+ properties.Single().Should().Be.OfType<HbmDynamicComponent>().And.ValueOf.Name.Should().Be.EqualTo("DynCompo");
+ }
+
+ [Test]
+ public void CallDynamicComponentMapper()
+ {
+ var properties = new List<object>();
+ var map = new StubPropertyContainerMapper<MyClassWithDynamic>(properties);
+ var called = false;
+ map.Component(For<MyClassWithDynamic>.Property(x=> x.DynCompo), (IDynamicComponentMapper cp) => called = true);
+ called.Should().Be.True();
+ }
+
private class HackPropertyContainerMapper : AbstractPropertyContainerMapper
{
public HackPropertyContainerMapper(System.Type container, HbmMapping mapDoc) : base(container, mapDoc) {}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 14:14:33
|
Revision: 5736
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5736&view=rev
Author: fabiomaulo
Date: 2011-04-22 14:14:26 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
dynamic-component mapping first try
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -21,6 +21,8 @@
private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>();
private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>();
private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>();
+ private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>();
private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>();
private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>();
private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>();
@@ -135,6 +137,11 @@
get { return properties; }
}
+ public IEnumerable<MemberInfo> DynamicComponents
+ {
+ get { return dynamicComponents; }
+ }
+
public IEnumerable<MemberInfo> PersistentMembers
{
get { return persistentMembers; }
@@ -404,6 +411,13 @@
splitDefinitions.Add(definition);
}
+ public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate)
+ {
+ persistentMembers.Add(member);
+ dynamicComponents.Add(member);
+ dynamicComponentTemplates[member] = componentTemplate;
+ }
+
private void AddTypeSplits(System.Type propertyContainer, string splitGroupId)
{
HashSet<string> splitsGroupsIds;
@@ -538,6 +552,18 @@
return properties.Contains(member);
}
+ public bool IsDynamicComponent(MemberInfo member)
+ {
+ return dynamicComponents.Contains(member);
+ }
+
+ public System.Type GetDynamicComponentTemplate(MemberInfo member)
+ {
+ System.Type template;
+ dynamicComponentTemplates.TryGetValue(member, out template);
+ return template ?? typeof(object);
+ }
+
public IEnumerable<string> GetPropertiesSplits(System.Type type)
{
return GetSplitGroupsFor(type);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -21,6 +21,7 @@
private readonly IEnumerable<MemberInfo> oneToOneRelations = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> poids = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> properties = Enumerable.Empty<MemberInfo>();
+ private readonly IEnumerable<MemberInfo> dynamicComponents = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> persistentMembers = new HashSet<MemberInfo>();
private readonly IEnumerable<System.Type> rootEntities = Enumerable.Empty<System.Type>();
private readonly IEnumerable<MemberInfo> sets = Enumerable.Empty<MemberInfo>();
@@ -138,6 +139,11 @@
get { return properties; }
}
+ public IEnumerable<MemberInfo> DynamicComponents
+ {
+ get { return dynamicComponents; }
+ }
+
public IEnumerable<MemberInfo> PersistentMembers
{
get { return persistentMembers; }
@@ -158,6 +164,11 @@
return null;
}
+ public System.Type GetDynamicComponentTemplate(MemberInfo member)
+ {
+ return typeof(object);
+ }
+
public void AddAsRootEntity(System.Type type) {}
public void AddAsComponent(System.Type type) {}
@@ -201,7 +212,7 @@
public void AddAsProperty(MemberInfo member) {}
public void AddAsPersistentMember(MemberInfo member){}
public void AddAsPropertySplit(SplitDefinition definition) {}
-
+ public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) {}
#endregion
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -42,11 +42,13 @@
IEnumerable<MemberInfo> Arrays { get; }
IEnumerable<MemberInfo> Dictionaries { get; }
IEnumerable<MemberInfo> Properties { get; }
+ IEnumerable<MemberInfo> DynamicComponents { get; }
IEnumerable<MemberInfo> PersistentMembers { get; }
IEnumerable<SplitDefinition> SplitDefinitions { get; }
IEnumerable<string> GetSplitGroupsFor(System.Type type);
string GetSplitGroupFor(MemberInfo member);
+ System.Type GetDynamicComponentTemplate(MemberInfo member);
void AddAsRootEntity(System.Type type);
void AddAsComponent(System.Type type);
@@ -73,5 +75,6 @@
void AddAsProperty(MemberInfo member);
void AddAsPersistentMember(MemberInfo member);
void AddAsPropertySplit(SplitDefinition definition);
+ void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate);
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -33,6 +33,8 @@
bool IsArray(MemberInfo role);
bool IsDictionary(MemberInfo role);
bool IsProperty(MemberInfo member);
+ bool IsDynamicComponent(MemberInfo member);
+ System.Type GetDynamicComponentTemplate(MemberInfo member);
IEnumerable<string> GetPropertiesSplits(System.Type type);
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -33,6 +33,9 @@
private readonly Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>> componentPropertyCustomizers =
new Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>>();
+ private readonly Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>> dynamicComponentCustomizers =
+ new Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>>();
+
private readonly Dictionary<System.Type, List<Action<IJoinedSubclassAttributesMapper>>> joinedClassCustomizers =
new Dictionary<System.Type, List<Action<IJoinedSubclassAttributesMapper>>>();
@@ -159,6 +162,11 @@
AddCustomizer(componentPropertyCustomizers, member, propertyCustomizer);
}
+ public void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer)
+ {
+ AddCustomizer(dynamicComponentCustomizers, member, propertyCustomizer);
+ }
+
public void AddCustomizer(PropertyPath member, Action<IManyToManyMapper> collectionRelationManyToManyCustomizer)
{
AddCustomizer(collectionRelationManyToManyCustomizers, member, collectionRelationManyToManyCustomizer);
@@ -274,6 +282,11 @@
InvokeCustomizers(componentPropertyCustomizers, member, mapper);
}
+ public void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper)
+ {
+ InvokeCustomizers(dynamicComponentCustomizers, member, mapper);
+ }
+
public void InvokeCustomizers(PropertyPath member, IManyToManyMapper mapper)
{
InvokeCustomizers(collectionRelationManyToManyCustomizers, member, mapper);
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -0,0 +1,50 @@
+using System;
+
+namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl
+{
+ public class DynamicComponentCustomizer<TComponent> : PropertyContainerCustomizer<TComponent>, IDynamicComponentMapper<TComponent> where TComponent : class
+ {
+ public DynamicComponentCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder, PropertyPath propertyPath)
+ : base(explicitDeclarationsHolder, customizersHolder, propertyPath)
+ {
+ if (propertyPath == null)
+ {
+ throw new ArgumentNullException("propertyPath");
+ }
+ if (explicitDeclarationsHolder == null)
+ {
+ throw new ArgumentNullException("explicitDeclarationsHolder");
+ }
+ explicitDeclarationsHolder.AddAsDynamicComponent(propertyPath.LocalMember, typeof(TComponent));
+ }
+
+ #region IDynamicComponentMapper<TComponent> Members
+
+ public void Access(Accessor accessor)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Access(System.Type accessorType)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OptimisticLock(bool takeInConsiderationForOptimisticLock)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Update(bool consideredInUpdateQuery)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Insert(bool consideredInInsertQuery)
+ {
+ throw new NotImplementedException();
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -83,9 +83,17 @@
TComponent dynamicComponentTemplate,
Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class
{
- throw new NotImplementedException();
+ RegisterDynamicComponentMapping(property, mapping);
}
+ protected virtual void RegisterDynamicComponentMapping<TComponent>(Expression<Func<TEntity, IDictionary>> property, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member)));
+ MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
+ mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, memberOf)));
+ }
+
public void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IManyToOneMapper> mapping)
where TProperty : class
{
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -23,7 +23,7 @@
public IEnumerable<MemberInfo> GetRootEntityMembers(System.Type entityClass)
{
- return GetCandidatePersistentProperties(entityClass, RootClassPropertiesBindingFlags).Concat(entityClass.GetFields(ClassFieldsBindingFlags));
+ return GetCandidatePersistentProperties(entityClass, RootClassPropertiesBindingFlags).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>());
}
public IEnumerable<MemberInfo> GetSubEntityMembers(System.Type entityClass, System.Type entitySuperclass)
@@ -35,17 +35,23 @@
{
IEnumerable<MemberInfo> propertiesOfSubclass = GetCandidatePersistentProperties(entityClass, flattenHierarchyBindingFlag);
IEnumerable<MemberInfo> propertiesOfBaseClass = GetCandidatePersistentProperties(entitySuperclass, flattenHierarchyBindingFlag);
- return propertiesOfSubclass.Except(propertiesOfBaseClass, new PropertyNameEqualityComparer()).Concat(entityClass.GetFields(ClassFieldsBindingFlags));
+ return propertiesOfSubclass.Except(propertiesOfBaseClass, new PropertyNameEqualityComparer()).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>());
}
else
{
- return GetCandidatePersistentProperties(entityClass, SubClassPropertiesBindingFlags).Concat(entityClass.GetFields(ClassFieldsBindingFlags));
+ return GetCandidatePersistentProperties(entityClass, SubClassPropertiesBindingFlags).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>());
}
}
+ protected IEnumerable<FieldInfo> GetUserDeclaredFields(System.Type type)
+ {
+ // can't find another way to exclude fields generated by the compiler (for both auto-properties and anonymous-types)
+ return type.GetFields(ClassFieldsBindingFlags).Where(x=> !x.Name.StartsWith("<"));
+ }
+
public IEnumerable<MemberInfo> GetComponentMembers(System.Type componentClass)
{
- return GetCandidatePersistentProperties(componentClass, ComponentPropertiesBindingFlags).Concat(componentClass.GetFields(ClassFieldsBindingFlags));
+ return GetCandidatePersistentProperties(componentClass, ComponentPropertiesBindingFlags).Concat(GetUserDeclaredFields(componentClass).Cast<MemberInfo>());
}
#endregion
@@ -55,7 +61,7 @@
System.Type analizing = type;
while (analizing != null && analizing != typeof (object))
{
- foreach (FieldInfo fieldInfo in analizing.GetFields(ClassFieldsBindingFlags))
+ foreach (FieldInfo fieldInfo in GetUserDeclaredFields(analizing))
{
yield return fieldInfo;
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -1,4 +1,3 @@
-using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -21,6 +20,8 @@
private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>();
private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>();
private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>();
+ private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>();
private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>();
private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>();
private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>();
@@ -132,6 +133,11 @@
get { return properties; }
}
+ public IEnumerable<MemberInfo> DynamicComponents
+ {
+ get { return dynamicComponents; }
+ }
+
public IEnumerable<MemberInfo> PersistentMembers
{
get { return persistentMembers; }
@@ -152,6 +158,13 @@
return null;
}
+ public System.Type GetDynamicComponentTemplate(MemberInfo member)
+ {
+ System.Type template;
+ dynamicComponentTemplates.TryGetValue(member, out template);
+ return template ?? typeof(object);
+ }
+
public void AddAsRootEntity(System.Type type)
{
rootEntities.Add(type);
@@ -262,6 +275,12 @@
splitDefinitions.Add(definition);
}
+ public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate)
+ {
+ dynamicComponents.Add(member);
+ dynamicComponentTemplates[member] = componentTemplate;
+ }
+
#endregion
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -24,6 +24,7 @@
void AddCustomizer(PropertyPath member, Action<IIdBagPropertiesMapper> propertyCustomizer);
void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer);
void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer);
+ void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer);
void InvokeCustomizers(System.Type type, IClassMapper mapper);
void InvokeCustomizers(System.Type type, ISubclassMapper mapper);
@@ -43,6 +44,7 @@
void InvokeCustomizers(PropertyPath member, IMapPropertiesMapper mapper);
void InvokeCustomizers(PropertyPath member, IIdBagPropertiesMapper mapper);
void InvokeCustomizers(PropertyPath member, IComponentAttributesMapper mapper);
+ void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper);
#region Collection Element relations invokers
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -36,6 +36,11 @@
System.Array.ForEach(source.Properties.ToArray(), destination.AddAsProperty);
System.Array.ForEach(source.PersistentMembers.ToArray(), destination.AddAsPersistentMember);
System.Array.ForEach(source.SplitDefinitions.ToArray(), destination.AddAsPropertySplit);
+ foreach (var dynamicComponent in source.DynamicComponents)
+ {
+ var template = source.GetDynamicComponentTemplate(dynamicComponent);
+ destination.AddAsDynamicComponent(dynamicComponent, template);
+ }
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -903,6 +903,10 @@
{
MapOneToOne(member, memberPath, propertiesContainer);
}
+ else if (modelInspector.IsDynamicComponent(property))
+ {
+ MapDynamicComponent(member, memberPath, propertyType, propertiesContainer);
+ }
else if (modelInspector.IsSet(property))
{
MapSet(member, memberPath, propertyType, propertiesContainer, propertiesContainerType);
@@ -938,6 +942,19 @@
}
}
+ private void MapDynamicComponent(MemberInfo member, PropertyPath memberPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer)
+ {
+ propertiesContainer.Component(member, (IDynamicComponentMapper componentMapper) =>
+ {
+ System.Type componentType = modelInspector.GetDynamicComponentTemplate(member);
+ IEnumerable<MemberInfo> persistentProperties = membersProvider.GetComponentMembers(componentType);
+
+ ForEachMemberPath(member, memberPath, pp => customizerHolder.InvokeCustomizers(pp, componentMapper));
+
+ MapProperties(propertyType, persistentProperties, componentMapper, memberPath);
+ });
+ }
+
private void MapAny(MemberInfo member, PropertyPath memberPath, IBasePlainPropertyContainerMapper propertiesContainer)
{
propertiesContainer.Any(member, typeof (int), anyMapper =>
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -27,6 +27,7 @@
private Func<MemberInfo, bool, bool> isVersion = (m, declared) => declared;
private Func<MemberInfo, bool, bool> isProperty = (m, declared) => declared;
+ private Func<MemberInfo, bool, bool> isDynamicComponent = (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;
@@ -341,6 +342,11 @@
get { return declaredModel.SplitDefinitions; }
}
+ IEnumerable<MemberInfo> IModelExplicitDeclarationsHolder.DynamicComponents
+ {
+ get { return declaredModel.DynamicComponents; }
+ }
+
IEnumerable<string> IModelExplicitDeclarationsHolder.GetSplitGroupsFor(System.Type type)
{
return declaredModel.GetSplitGroupsFor(type);
@@ -461,6 +467,11 @@
declaredModel.AddAsPropertySplit(definition);
}
+ void IModelExplicitDeclarationsHolder.AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate)
+ {
+ declaredModel.AddAsDynamicComponent(member, componentTemplate);
+ }
+
#endregion
#region Implementation of IModelInspector
@@ -603,6 +614,21 @@
return isProperty(member, declaredResult);
}
+ bool IModelInspector.IsDynamicComponent(MemberInfo member)
+ {
+ bool declaredResult = declaredModel.IsDynamicComponent(member);
+ return isDynamicComponent(member, declaredResult);
+ }
+
+ System.Type IModelInspector.GetDynamicComponentTemplate(MemberInfo member)
+ {
+ return declaredModel.GetDynamicComponentTemplate(member);
+ }
+ System.Type IModelExplicitDeclarationsHolder.GetDynamicComponentTemplate(MemberInfo member)
+ {
+ return declaredModel.GetDynamicComponentTemplate(member);
+ }
+
IEnumerable<string> IModelInspector.GetPropertiesSplits(System.Type type)
{
IEnumerable<string> declaredResult = declaredModel.GetPropertiesSplits(type);
@@ -826,5 +852,14 @@
}
isTablePerClassSplit = match;
}
+
+ public void IsDynamicComponent(Func<MemberInfo, bool, bool> match)
+ {
+ if (match == null)
+ {
+ return;
+ }
+ isDynamicComponent = match;
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-22 14:14:26 UTC (rev 5736)
@@ -295,6 +295,7 @@
<Compile Include="Mapping\ByCode\Conformist\SubclassMapping.cs" />
<Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" />
<Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" />
+ <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" />
<Compile Include="Mapping\ByCode\PropertyToField.cs" />
<Compile Include="Mapping\ByCode\SimpleModelInspector.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -0,0 +1,36 @@
+using System;
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ExpliticMappingTests
+{
+ public class DynamicComponentMappingTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ public IDictionary Info { get; set; }
+ }
+
+ [Test]
+ public void WhenMapDynCompoThenMapItAndItsProperties()
+ {
+ 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>().SingleOrDefault();
+ hbmDynamicComponent.Should().Not.Be.Null();
+ hbmDynamicComponent.Properties.Select(x=> x.Name).Should().Have.SameValuesAs("MyInt", "MyDate");
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-22 14:14:26 UTC (rev 5736)
@@ -259,6 +259,18 @@
destination.RootEntities.Should().Have.Count.EqualTo(1);
}
+ [Test]
+ public void MergeDynamicComponents()
+ {
+ var destination = new ExplicitDeclarationsHolder();
+ var source = new ExplicitDeclarationsHolder();
+ source.AddAsDynamicComponent(property, typeof(MyClass));
+
+ destination.Merge(source);
+ destination.DynamicComponents.Should().Have.Count.EqualTo(1);
+ destination.GetDynamicComponentTemplate(property).Should().Be(typeof(MyClass));
+ }
+
#region Nested type: MyClass
private class MyClass
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 02:55:49 UTC (rev 5735)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 14:14:26 UTC (rev 5736)
@@ -536,6 +536,7 @@
<Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ModelMapperAddMappingByTypeTests.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\SubclassMappingRegistration.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\UnionSubclassMappingRegistrationTest.cs" />
+ <Compile Include="MappingByCode\ExpliticMappingTests\DynamicComponentMappingTests.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\IdBagMappingTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\MappingOfPrivateMembersOnRootEntity.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\NaturalIdTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
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.
|
|
From: <fab...@us...> - 2011-04-22 16:11:44
|
Revision: 5739
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5739&view=rev
Author: fabiomaulo
Date: 2011-04-22 16:11:38 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add component property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs 2011-04-22 15:36:27 UTC (rev 5738)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739)
@@ -12,11 +12,16 @@
private ComponentParentMapper parentMapper;
public ComponentMapper(HbmComponent component, System.Type componentType, MemberInfo declaringTypeMember, HbmMapping mapDoc)
+ : this(component,componentType, new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x), mapDoc)
+ {
+ }
+
+ public ComponentMapper(HbmComponent component, System.Type componentType, IAccessorPropertyMapper accessorMapper, HbmMapping mapDoc)
: base(componentType, mapDoc)
{
this.component = component;
component.@class = componentType.GetShortClassName(mapDoc);
- accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x);
+ accessorPropertyMapper = accessorMapper;
}
#region Overrides of AbstractPropertyContainerMapper
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 15:36:27 UTC (rev 5738)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739)
@@ -38,6 +38,13 @@
AddProperty(hbmProperty);
}
+ public override void Component(MemberInfo property, Action<IComponentMapper> mapping)
+ {
+ var hbm = new HbmComponent { name = property.Name };
+ mapping(new ComponentMapper(hbm, property.GetPropertyOrFieldType(), new NoMemberPropertyMapper(), MapDoc));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs 2011-04-22 16:11:38 UTC (rev 5739)
@@ -0,0 +1,67 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class ComponentPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ private class MyClass
+ {
+ public int Something { get; set; }
+ }
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ mapper.Component(propertyInfo, (IComponentMapper x) => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.Component(propertyInfo, (IComponentMapper x) => called = true);
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ mapper.Component(propertyInfo, (IComponentMapper x) => x.Access(Accessor.Field));
+
+ component.Properties.OfType<HbmComponent>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 15:36:27 UTC (rev 5738)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 16:11:38 UTC (rev 5739)
@@ -551,6 +551,7 @@
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 17:38:04
|
Revision: 5740
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5740&view=rev
Author: fabiomaulo
Date: 2011-04-22 17:37:58 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add dyn-component property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:37:58 UTC (rev 5740)
@@ -10,10 +10,14 @@
private readonly HbmDynamicComponent component;
private readonly IAccessorPropertyMapper accessorPropertyMapper;
- public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc) : base(declaringTypeMember.DeclaringType, mapDoc)
+ public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc)
+ : this(component, declaringTypeMember, new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x), mapDoc) {}
+
+ private DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, IAccessorPropertyMapper accessorMapper, HbmMapping mapDoc)
+ : base(declaringTypeMember.DeclaringType, mapDoc)
{
this.component = component;
- accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x);
+ accessorPropertyMapper = accessorMapper;
}
protected override void AddProperty(object property)
@@ -45,6 +49,13 @@
AddProperty(hbm);
}
+ public override void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping)
+ {
+ var hbm = new HbmDynamicComponent { name = property.Name };
+ mapping(new DynamicComponentMapper(hbm, property, new NoMemberPropertyMapper(), MapDoc));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs 2011-04-22 17:37:58 UTC (rev 5740)
@@ -0,0 +1,63 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class DynComponentPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo
+
+ mapper.Component(propertyInfo, (IDynamicComponentMapper x) => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("Info");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo
+
+ var called = false;
+ mapper.Component(propertyInfo, (IDynamicComponentMapper x) => called = true);
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo
+
+ mapper.Component(propertyInfo, (IDynamicComponentMapper x) => x.Access(Accessor.Field));
+
+ component.Properties.OfType<HbmDynamicComponent>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 16:11:38 UTC (rev 5739)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:37:58 UTC (rev 5740)
@@ -553,6 +553,7 @@
<Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" />
<Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 17:51:29
|
Revision: 5741
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5741&view=rev
Author: fabiomaulo
Date: 2011-04-22 17:51:22 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add many-to-one property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:37:58 UTC (rev 5740)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:51:22 UTC (rev 5741)
@@ -56,6 +56,13 @@
AddProperty(hbm);
}
+ public override void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping)
+ {
+ var hbm = new HbmManyToOne { name = property.Name };
+ mapping(new ManyToOneMapper(property, new NoMemberPropertyMapper(), hbm, MapDoc));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs 2011-04-22 17:37:58 UTC (rev 5740)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs 2011-04-22 17:51:22 UTC (rev 5741)
@@ -14,6 +14,9 @@
private readonly MemberInfo member;
public ManyToOneMapper(MemberInfo member, HbmManyToOne manyToOne, HbmMapping mapDoc)
+ : this(member, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => manyToOne.access = x), manyToOne, mapDoc) {}
+
+ public ManyToOneMapper(MemberInfo member, IAccessorPropertyMapper accessorPropertyMapper, HbmManyToOne manyToOne, HbmMapping mapDoc)
{
this.member = member;
this.manyToOne = manyToOne;
@@ -22,14 +25,7 @@
{
this.manyToOne.access = "none";
}
- if (member == null)
- {
- entityPropertyMapper = new NoMemberPropertyMapper();
- }
- else
- {
- entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => manyToOne.access = x);
- }
+ entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorPropertyMapper;
}
#region Implementation of IManyToOneMapper
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs 2011-04-22 17:51:22 UTC (rev 5741)
@@ -0,0 +1,67 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class ManyToOnePropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ private class MyClass
+ {
+ public int Id { get; set; }
+ }
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ mapper.ManyToOne(propertyInfo, x => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.ManyToOne(propertyInfo, x => called = true);
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ mapper.ManyToOne(propertyInfo, x => x.Access(Accessor.Field));
+
+ component.Properties.OfType<HbmManyToOne>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 17:37:58 UTC (rev 5740)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:51:22 UTC (rev 5741)
@@ -554,6 +554,7 @@
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" />
<Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 18:04:26
|
Revision: 5742
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5742&view=rev
Author: fabiomaulo
Date: 2011-04-22 18:04:20 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add any property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-22 17:51:22 UTC (rev 5741)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-22 18:04:20 UTC (rev 5742)
@@ -84,7 +84,7 @@
AddProperty(hbm);
}
- public void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping)
+ public virtual void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping)
{
if (!IsMemberSupportedByMappedContainer(property))
{
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-04-22 17:51:22 UTC (rev 5741)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-04-22 18:04:20 UTC (rev 5742)
@@ -20,6 +20,9 @@
private readonly MemberInfo member;
public AnyMapper(MemberInfo member, System.Type foreignIdType, HbmAny any, HbmMapping mapDoc)
+ : this(member, foreignIdType, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x), any, mapDoc) {}
+
+ public AnyMapper(MemberInfo member, System.Type foreignIdType, IAccessorPropertyMapper accessorMapper, HbmAny any, HbmMapping mapDoc)
{
this.member = member;
this.foreignIdType = foreignIdType;
@@ -29,14 +32,7 @@
{
this.any.access = "none";
}
- if (member == null)
- {
- entityPropertyMapper = new NoMemberPropertyMapper();
- }
- else
- {
- entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x);
- }
+ entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorMapper;
if (foreignIdType == null)
{
throw new ArgumentNullException("foreignIdType");
@@ -53,7 +49,7 @@
var classHbmColumn = new HbmColumn();
string classColumnName = member == null ? DefaultMetaColumnNameWhenNoProperty : member.Name + "Class";
classColumnMapper = new ColumnMapper(classHbmColumn, classColumnName);
- any.column = new[] {classHbmColumn, idHbmColumn};
+ any.column = new[] { classHbmColumn, idHbmColumn };
}
#region Implementation of IAccessorPropertyMapper
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:51:22 UTC (rev 5741)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:04:20 UTC (rev 5742)
@@ -63,6 +63,13 @@
AddProperty(hbm);
}
+ public override void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping)
+ {
+ var hbm = new HbmAny { name = property.Name };
+ mapping(new AnyMapper(property, idTypeOfMetaType, new NoMemberPropertyMapper(), hbm, MapDoc));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs 2011-04-22 18:04:20 UTC (rev 5742)
@@ -0,0 +1,63 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class AnyPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A");
+
+ mapper.Any(propertyInfo, typeof(int), x => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.Any(propertyInfo, typeof(int), x => called = true);
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A");
+
+ mapper.Any(propertyInfo, typeof(int), x => x.Access(Accessor.Field));
+
+ component.Properties.OfType<HbmAny>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 17:51:22 UTC (rev 5741)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:04:20 UTC (rev 5742)
@@ -551,6 +551,7 @@
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 18:10:34
|
Revision: 5743
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5743&view=rev
Author: fabiomaulo
Date: 2011-04-22 18:10:28 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add one-to-one property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:04:20 UTC (rev 5742)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:10:28 UTC (rev 5743)
@@ -70,6 +70,13 @@
AddProperty(hbm);
}
+ public override void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping)
+ {
+ var hbm = new HbmOneToOne { name = property.Name };
+ mapping(new OneToOneMapper(property, new NoMemberPropertyMapper(), hbm));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs 2011-04-22 18:04:20 UTC (rev 5742)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs 2011-04-22 18:10:28 UTC (rev 5743)
@@ -11,6 +11,9 @@
private readonly HbmOneToOne oneToOne;
public OneToOneMapper(MemberInfo member, HbmOneToOne oneToOne)
+ : this(member, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => oneToOne.access = x), oneToOne) {}
+
+ public OneToOneMapper(MemberInfo member, IAccessorPropertyMapper accessorMapper, HbmOneToOne oneToOne)
{
this.member = member;
this.oneToOne = oneToOne;
@@ -18,14 +21,7 @@
{
this.oneToOne.access = "none";
}
- if (member == null)
- {
- entityPropertyMapper = new NoMemberPropertyMapper();
- }
- else
- {
- entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => oneToOne.access = x);
- }
+ entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorMapper;
}
#region Implementation of IOneToOneMapper
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs 2011-04-22 18:10:28 UTC (rev 5743)
@@ -0,0 +1,67 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class OneToOnePropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ private class MyClass
+ {
+ public int Id { get; set; }
+ }
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ mapper.OneToOne(propertyInfo, x => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.OneToOne(propertyInfo, x => called = true);
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A");
+
+ mapper.OneToOne(propertyInfo, x => x.Access(Accessor.Field));
+
+ component.Properties.OfType<HbmOneToOne>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 18:04:20 UTC (rev 5742)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:10:28 UTC (rev 5743)
@@ -556,6 +556,7 @@
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" />
<Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 18:20:37
|
Revision: 5744
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5744&view=rev
Author: fabiomaulo
Date: 2011-04-22 18:20:31 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add bag property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-04-22 18:10:28 UTC (rev 5743)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-04-22 18:20:31 UTC (rev 5744)
@@ -15,6 +15,9 @@
private ICacheMapper cacheMapper;
public BagMapper(System.Type ownerType, System.Type elementType, HbmBag mapping)
+ : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {}
+
+ public BagMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmBag mapping)
{
if (ownerType == null)
{
@@ -36,7 +39,7 @@
mapping.key = new HbmKey();
}
keyMapper = new KeyMapper(ownerType, mapping.Key);
- entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x);
+ entityPropertyMapper = accessorMapper;
}
public System.Type OwnerType { get; private set; }
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:10:28 UTC (rev 5743)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:20:31 UTC (rev 5744)
@@ -77,6 +77,16 @@
AddProperty(hbm);
}
+ public override void Bag(MemberInfo property, Action<IBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping)
+ {
+ var hbm = new HbmBag { name = property.Name };
+ System.Type propertyType = property.GetPropertyOrFieldType();
+ System.Type collectionElementType = propertyType.DetermineCollectionElementType();
+ collectionMapping(new BagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm));
+ mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs 2011-04-22 18:20:31 UTC (rev 5744)
@@ -0,0 +1,64 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class BagPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.Bag(propertyInfo, x => { }, rel => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.Bag(propertyInfo, x => called = true, rel => { });
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.Bag(propertyInfo, x => x.Access(Accessor.Field), rel => { });
+
+ component.Properties.OfType<HbmBag>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 18:10:28 UTC (rev 5743)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:20:31 UTC (rev 5744)
@@ -552,6 +552,7 @@
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 18:26:15
|
Revision: 5745
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5745&view=rev
Author: fabiomaulo
Date: 2011-04-22 18:26:08 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add set property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:20:31 UTC (rev 5744)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:26:08 UTC (rev 5745)
@@ -87,6 +87,16 @@
AddProperty(hbm);
}
+ public override void Set(MemberInfo property, Action<ISetPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping)
+ {
+ var hbm = new HbmSet { name = property.Name };
+ System.Type propertyType = property.GetPropertyOrFieldType();
+ System.Type collectionElementType = propertyType.DetermineCollectionElementType();
+ collectionMapping(new SetMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm));
+ mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-04-22 18:20:31 UTC (rev 5744)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-04-22 18:26:08 UTC (rev 5745)
@@ -15,6 +15,9 @@
private ICacheMapper cacheMapper;
public SetMapper(System.Type ownerType, System.Type elementType, HbmSet mapping)
+ : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {}
+
+ public SetMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmSet mapping)
{
if (ownerType == null)
{
@@ -36,7 +39,7 @@
mapping.key = new HbmKey();
}
keyMapper = new KeyMapper(ownerType, mapping.Key);
- entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x);
+ entityPropertyMapper = accessorMapper;
}
public System.Type OwnerType { get; private set; }
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs 2011-04-22 18:26:08 UTC (rev 5745)
@@ -0,0 +1,64 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class SetPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.Set(propertyInfo, x => { }, rel => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.Set(propertyInfo, x => called = true, rel => { });
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.Set(propertyInfo, x => x.Access(Accessor.Field), rel => { });
+
+ component.Properties.OfType<HbmSet>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 18:20:31 UTC (rev 5744)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:26:08 UTC (rev 5745)
@@ -558,6 +558,7 @@
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" />
<Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 18:31:50
|
Revision: 5746
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5746&view=rev
Author: fabiomaulo
Date: 2011-04-22 18:31:43 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add list property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:26:08 UTC (rev 5745)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:31:43 UTC (rev 5746)
@@ -97,6 +97,16 @@
AddProperty(hbm);
}
+ public override void List(MemberInfo property, Action<IListPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping)
+ {
+ var hbm = new HbmList { name = property.Name };
+ System.Type propertyType = property.GetPropertyOrFieldType();
+ System.Type collectionElementType = propertyType.DetermineCollectionElementType();
+ collectionMapping(new ListMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm));
+ mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item1 = rel));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-04-22 18:26:08 UTC (rev 5745)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-04-22 18:31:43 UTC (rev 5746)
@@ -16,6 +16,9 @@
private ICacheMapper cacheMapper;
public ListMapper(System.Type ownerType, System.Type elementType, HbmList mapping)
+ : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {}
+
+ public ListMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmList mapping)
{
if (ownerType == null)
{
@@ -40,7 +43,7 @@
var listIndex = new HbmListIndex();
mapping.Item = listIndex;
listIndexMapper = new ListIndexMapper(ownerType, listIndex);
- entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x);
+ entityPropertyMapper = accessorMapper;
}
public System.Type OwnerType { get; private set; }
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs 2011-04-22 18:31:43 UTC (rev 5746)
@@ -0,0 +1,64 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class ListPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.List(propertyInfo, x => { }, rel => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.List(propertyInfo, x => called = true, rel => { });
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.List(propertyInfo, x => x.Access(Accessor.Field), rel => { });
+
+ component.Properties.OfType<HbmList>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 18:26:08 UTC (rev 5745)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:31:43 UTC (rev 5746)
@@ -556,6 +556,7 @@
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 18:40:17
|
Revision: 5747
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5747&view=rev
Author: fabiomaulo
Date: 2011-04-22 18:40:11 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add map property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:31:43 UTC (rev 5746)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:40:11 UTC (rev 5747)
@@ -107,6 +107,19 @@
AddProperty(hbm);
}
+ public override void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping, Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping)
+ {
+ var hbm = new HbmMap { name = property.Name };
+ System.Type propertyType = property.GetPropertyOrFieldType();
+ System.Type dictionaryKeyType = propertyType.DetermineDictionaryKeyType();
+ System.Type dictionaryValueType = propertyType.DetermineDictionaryValueType();
+
+ collectionMapping(new MapMapper(container, dictionaryKeyType, dictionaryValueType, new NoMemberPropertyMapper(), hbm, mapDoc));
+ keyMapping(new MapKeyRelation(dictionaryKeyType, hbm, mapDoc));
+ mapping(new CollectionElementRelation(dictionaryValueType, MapDoc, rel => hbm.Item1 = rel));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-04-22 18:31:43 UTC (rev 5746)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-04-22 18:40:11 UTC (rev 5747)
@@ -16,6 +16,9 @@
private ICacheMapper cacheMapper;
public MapMapper(System.Type ownerType, System.Type keyType, System.Type valueType, HbmMap mapping, HbmMapping mapDoc)
+ : this(ownerType, keyType, valueType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping, mapDoc) {}
+
+ public MapMapper(System.Type ownerType, System.Type keyType, System.Type valueType, IAccessorPropertyMapper accessorMapper, HbmMap mapping, HbmMapping mapDoc)
{
if (ownerType == null)
{
@@ -52,7 +55,7 @@
{
mapping.Item = new HbmMapKeyManyToMany {@class = KeyType.GetShortClassName(mapDoc)};
}
- entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x);
+ entityPropertyMapper = accessorMapper;
}
public System.Type OwnerType { get; private set; }
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs 2011-04-22 18:40:11 UTC (rev 5747)
@@ -0,0 +1,64 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class MapPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A");
+
+ mapper.Map(propertyInfo, x => { }, km => { }, rel => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.Map(propertyInfo, x => called = true, km => { }, rel => { });
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A");
+
+ mapper.Map(propertyInfo, x => x.Access(Accessor.Field), km => { }, rel => { });
+
+ component.Properties.OfType<HbmMap>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 18:31:43 UTC (rev 5746)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:40:11 UTC (rev 5747)
@@ -558,6 +558,7 @@
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\MapPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-22 18:54:36
|
Revision: 5748
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5748&view=rev
Author: fabiomaulo
Date: 2011-04-22 18:54:29 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
Fix add idbag property to a dynamic-component
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-22 18:40:11 UTC (rev 5747)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-22 18:54:29 UTC (rev 5748)
@@ -61,7 +61,7 @@
AddProperty(hbm);
}
- public void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping)
+ public virtual void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping)
{
var hbm = new HbmIdbag { name = property.Name };
System.Type propertyType = property.GetPropertyOrFieldType();
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:40:11 UTC (rev 5747)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:54:29 UTC (rev 5748)
@@ -120,6 +120,16 @@
AddProperty(hbm);
}
+ public override void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping)
+ {
+ var hbm = new HbmIdbag { name = property.Name };
+ System.Type propertyType = property.GetPropertyOrFieldType();
+ System.Type collectionElementType = propertyType.DetermineCollectionElementType();
+ collectionMapping(new IdBagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm));
+ mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel));
+ AddProperty(hbm);
+ }
+
protected override bool IsMemberSupportedByMappedContainer(MemberInfo property)
{
return true;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-04-22 18:40:11 UTC (rev 5747)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-04-22 18:54:29 UTC (rev 5748)
@@ -16,6 +16,9 @@
private readonly CollectionIdMapper idMapper;
public IdBagMapper(System.Type ownerType, System.Type elementType, HbmIdbag mapping)
+ : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {}
+
+ public IdBagMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmIdbag mapping)
{
if (ownerType == null)
{
@@ -42,7 +45,7 @@
mapping.collectionid = new HbmCollectionId();
}
idMapper = new CollectionIdMapper(mapping.collectionid);
- entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x);
+ entityPropertyMapper = accessorMapper;
}
public System.Type OwnerType { get; private set; }
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs 2011-04-22 18:54:29 UTC (rev 5748)
@@ -0,0 +1,64 @@
+using System.Collections;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests
+{
+ public class IdBagPropertyOnDynamicCompoTests
+ {
+ private class Person
+ {
+ public int Id { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ }
+ }
+
+ [Test]
+ public void WhenAddThenHas()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.IdBag(propertyInfo, x => { }, rel => { });
+
+ component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A");
+ }
+
+ [Test]
+ public void WhenCustomizeThenCallCustomizer()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ var called = false;
+ mapper.IdBag(propertyInfo, x => called = true, rel => { });
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void WhenCustomizeAccessorThenIgnore()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmDynamicComponent();
+ var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc);
+ var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A");
+
+ mapper.IdBag(propertyInfo, x => x.Access(Accessor.Field), rel => { });
+
+ component.Properties.OfType<HbmIdbag>().Single().Access.Should().Be.NullOrEmpty();
+ }
+ }
+}
\ 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 18:40:11 UTC (rev 5747)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:54:29 UTC (rev 5748)
@@ -556,6 +556,7 @@
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\IdBagPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\MapPropertyOnDynamicCompoTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-23 18:51:43
|
Revision: 5751
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5751&view=rev
Author: fabiomaulo
Date: 2011-04-23 18:51:34 +0000 (Sat, 23 Apr 2011)
Log Message:
-----------
- Fix NH-2669 (patch completed, and test fixed) thanks to Rory Plaire to port the Hb fix
- Fix NH-2670
- Fix ByCode (subclass registration and TypeNameUtil)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs
trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs
trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml
trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/
trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -393,5 +393,8 @@
bool IsReadOnly(object entityOrProxy);
void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object generatedId);
+
+ /// <summary>Is in a two-phase load? </summary>
+ bool IsLoadFinished { get; }
}
}
Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -1205,6 +1205,14 @@
oldEntry.LoadedWithLazyPropertiesUnfetched);
}
+ public bool IsLoadFinished
+ {
+ get
+ {
+ return loadCounter == 0;
+ }
+ }
+
#endregion
public override string ToString()
Modified: trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -53,7 +53,15 @@
public override void InitializeCollection(IPersistentCollection collection, bool writing)
{
- throw new SessionException("collections cannot be fetched by a stateless session");
+ if(temporaryPersistenceContext.IsLoadFinished)
+ {
+ throw new SessionException("Collections cannot be fetched by a stateless session. You can eager load it through specific query.");
+ }
+ CollectionEntry ce = temporaryPersistenceContext.GetCollectionEntry(collection);
+ if (!collection.WasInitialized)
+ {
+ ce.LoadedPersister.Initialize(ce.LoadedKey, this);
+ }
}
public override object InternalLoad(string entityName, object id, bool eager, bool isNullable)
@@ -733,7 +741,10 @@
{
CheckAndUpdateSessionStatus();
object result = Factory.GetEntityPersister(entityName).Load(id, null, lockMode, this);
- temporaryPersistenceContext.Clear();
+ if (temporaryPersistenceContext.IsLoadFinished)
+ {
+ temporaryPersistenceContext.Clear();
+ }
return result;
}
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -15,6 +15,9 @@
throw new ArgumentNullException("explicitDeclarationsHolder");
}
explicitDeclarationsHolder.AddAsTablePerClassEntity(typeof (TEntity));
+ // Add an empty customizer as a way to register the class as explicity declared
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinedSubclassAttributesMapper m) => { });
+
keyMapper = new JoinedSubclassKeyCustomizer<TEntity>(customizersHolder);
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -16,6 +16,9 @@
throw new ArgumentNullException("explicitDeclarationsHolder");
}
explicitDeclarationsHolder.AddAsTablePerClassHierarchyEntity(typeof (TEntity));
+
+ // Add an empty customizer as a way to register the class as explicity declared
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (ISubclassMapper m) => { });
}
#region ISubclassMapper<TEntity> Members
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -13,6 +13,9 @@
throw new ArgumentNullException("explicitDeclarationsHolder");
}
explicitDeclarationsHolder.AddAsTablePerConcreteClassEntity(typeof (TEntity));
+
+ // Add an empty customizer as a way to register the class as explicity declared
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IUnionSubclassAttributesMapper m) => { });
}
#region Implementation of IEntityAttributesMapper
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -49,14 +49,19 @@
}
if (!string.IsNullOrEmpty(assembly) && string.IsNullOrEmpty(@namespace))
{
- return string.Concat(type.Name, ", ", assembly);
+ return string.Concat(GetTypeNameForMapping(type), ", ", assembly);
}
if (string.IsNullOrEmpty(assembly) && !string.IsNullOrEmpty(@namespace))
{
return type.FullName;
}
- return type.Name;
+ return GetTypeNameForMapping(type);
}
+
+ private static string GetTypeNameForMapping(System.Type type)
+ {
+ return !type.IsGenericType ? type.Name: type.FullName;
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,141 @@
+using System;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode
+{
+ public class MyEntity
+ {
+
+ }
+ public class MyGenericEntity<T>
+ {
+
+ }
+
+ public class TypeNameUtilTests
+ {
+ [Test]
+ public void WhenTypeNullThenNull()
+ {
+ System.Type variableType = null;
+ variableType.GetShortClassName(new HbmMapping()).Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenMapDocNullThenAssemblyQualifiedName()
+ {
+ typeof(MyEntity).GetShortClassName(null).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WhenMapDocHaveDefaultAssemblyThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyEntity).Assembly.FullName;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName);
+ }
+
+ [Test]
+ public void WhenMapDocHaveDefaultAssemblyNameThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyEntity).Assembly.GetName().Name;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName);
+ }
+
+ [Test]
+ public void WhenMapDocHaveDefaultsThenName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyEntity).Assembly.FullName;
+ mapDoc.@namespace = typeof(MyEntity).Namespace;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).Name);
+ }
+
+ [Test]
+ public void WhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = "whatever";
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly()
+ {
+ // strange but possible
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = typeof(MyEntity).Namespace;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().StartWith(typeof(MyEntity).Name).And.EndWith(", " + typeof(MyEntity).Assembly.GetName().Name);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocNullThenAssemblyQualifiedName()
+ {
+ typeof(MyGenericEntity<int>).GetShortClassName(null).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocHaveDefaultAssemblyThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocHaveDefaultAssemblyNameThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.GetName().Name;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocHaveDefaultsThenName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName;
+ mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = "whatever";
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WithGenericWhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly()
+ {
+ // strange but possible
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().StartWith(typeof(MyGenericEntity<int>).FullName).And.EndWith(", " + typeof(MyGenericEntity<int>).Assembly.GetName().Name);
+ }
+ }
+}
\ 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 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-23 18:51:34 UTC (rev 5751)
@@ -600,6 +600,7 @@
<Compile Include="MappingByCode\NatureDemo\Naturalness\StateProvince.cs" />
<Compile Include="MappingByCode\NatureDemo\Naturalness\User.cs" />
<Compile Include="MappingByCode\NatureDemo\Naturalness\Zoo.cs" />
+ <Compile Include="MappingByCode\TypeNameUtilTests.cs" />
<Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" />
<Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" />
<Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Domain.cs" />
@@ -814,6 +815,15 @@
<Compile Include="ReadOnly\StudentDto.cs" />
<Compile Include="ReadOnly\TextHolder.cs" />
<Compile Include="ReadOnly\VersionedNode.cs" />
+ <Compile Include="Stateless\Contact.cs" />
+ <Compile Include="Stateless\Country.cs" />
+ <Compile Include="Stateless\FetchingLazyCollections\LazyCollectionFetchTests.cs" />
+ <Compile Include="Stateless\Fetching\Resource.cs" />
+ <Compile Include="Stateless\Fetching\StatelessSessionFetchingTest.cs" />
+ <Compile Include="Stateless\Fetching\Task.cs" />
+ <Compile Include="Stateless\Fetching\User.cs" />
+ <Compile Include="Stateless\Org.cs" />
+ <Compile Include="Stateless\StatelessSessionQueryFixture.cs" />
<Compile Include="Subselect\ClassSubselectFixture.cs" />
<Compile Include="Subselect\Domain.cs" />
<Compile Include="TestCaseMappingByCode.cs" />
@@ -2617,6 +2627,8 @@
<EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
+ <EmbeddedResource Include="Stateless\Contact.hbm.xml" />
+ <EmbeddedResource Include="Stateless\Fetching\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2660And2661\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\DataReaderWrapperTest\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2583\Mappings.hbm.xml" />
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,34 @@
+namespace NHibernate.Test.Stateless
+{
+ public class Contact
+ {
+ private int id;
+ private Org org;
+
+ public virtual int Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ id = value;
+ }
+ }
+
+ public virtual Org Org
+ {
+ get
+ {
+ return org;
+ }
+
+ set
+ {
+ org = value;
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.Stateless">
+
+ <class name="Contact">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ <many-to-one name="Org" lazy="false" fetch="join" />
+ </class>
+
+ <class name="Org">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ <many-to-one name="Country" lazy="false" fetch="join" />
+ </class>
+
+ <class name="Country">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ </class>
+
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,20 @@
+namespace NHibernate.Test.Stateless
+{
+ public class Country
+ {
+ private int id;
+
+ public virtual int Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ id = value;
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.Stateless.Fetching">
+ <class name="User" table="User_">
+ <id name="Id" type="long">
+ <generator class="increment" />
+ </id>
+ <property name="Name" />
+ </class>
+
+ <class name="Resource">
+ <id name="Id" type="long">
+ <generator class="increment" />
+ </id>
+ <property name="Name" />
+ <many-to-one name="Owner"/>
+ </class>
+
+ <class name="Task">
+ <id name="Id" type="long">
+ <generator class="increment" />
+ </id>
+ <property name="Description" />
+ <many-to-one name="User" column="user_"/>
+ <many-to-one name="Resource"/>
+ <property name="DueDate" />
+ <property name="StartDate" />
+ <property name="CompletionDate" />
+ </class>
+
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,59 @@
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ public class Resource
+ {
+ private long? id;
+ private string name;
+ private User owner;
+
+ public Resource()
+ {
+ }
+
+ public Resource(string name, User owner)
+ {
+ this.name = name;
+ this.owner = owner;
+ }
+
+ public virtual long? Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ this.id = value;
+ }
+ }
+
+ public virtual string Name
+ {
+ get
+ {
+ return name;
+ }
+
+ set
+ {
+ this.name = value;
+ }
+ }
+
+ public virtual User Owner
+ {
+ get
+ {
+ return owner;
+ }
+
+ set
+ {
+ this.owner = value;
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,75 @@
+using System;
+using System.Collections;
+using log4net;
+using NUnit.Framework;
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ [TestFixture]
+ public class StatelessSessionFetchingTest : TestCase
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(StatelessSessionFetchingTest));
+
+ protected override string MappingsAssembly
+ {
+ get { return "NHibernate.Test"; }
+ }
+
+ protected override IList Mappings
+ {
+ get
+ {
+ return new[] { "Stateless.Fetching.Mappings.hbm.xml" };
+ }
+ }
+
+ [Test]
+ public void DynamicFetch()
+ {
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ DateTime now = DateTime.Now;
+ User me = new User("me");
+ User you = new User("you");
+ Resource yourClock = new Resource("clock", you);
+ Task task = new Task(me, "clean", yourClock, now); // :)
+ s.Save(me);
+ s.Save(you);
+ s.Save(yourClock);
+ s.Save(task);
+ tx.Commit();
+ }
+
+ using (IStatelessSession ss = sessions.OpenStatelessSession())
+ using (ITransaction tx = ss.BeginTransaction())
+ {
+ ss.BeginTransaction();
+ Task taskRef =
+ (Task)ss.CreateQuery("from Task t join fetch t.Resource join fetch t.User").UniqueResult();
+ Assert.True(taskRef != null);
+ Assert.True(NHibernateUtil.IsInitialized(taskRef));
+ Assert.True(NHibernateUtil.IsInitialized(taskRef.User));
+ Assert.True(NHibernateUtil.IsInitialized(taskRef.Resource));
+ Assert.False(NHibernateUtil.IsInitialized(taskRef.Resource.Owner));
+ tx.Commit();
+ }
+
+ cleanup();
+ }
+
+ private void cleanup()
+ {
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ s.BeginTransaction();
+ s.CreateQuery("delete Task").ExecuteUpdate();
+ s.CreateQuery("delete Resource").ExecuteUpdate();
+ s.CreateQuery("delete User").ExecuteUpdate();
+ tx.Commit();
+ }
+ }
+ }
+
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,134 @@
+using System;
+
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ public class Task
+ {
+ private long? id;
+ private string description;
+ private User user;
+ private Resource resource;
+ private DateTime dueDate;
+ private DateTime? startDate;
+ private DateTime? completionDate;
+
+ public Task()
+ {
+ }
+
+ public Task(User user, string description, Resource resource, DateTime dueDate)
+ : this(user, description, resource, dueDate, null, null)
+ {
+ }
+
+ public Task(User user, string description, Resource resource, DateTime dueDate, DateTime? startDate, DateTime? completionDate)
+ {
+ this.user = user;
+ this.resource = resource;
+ this.description = description;
+ this.dueDate = dueDate;
+ this.startDate = startDate;
+ this.completionDate = completionDate;
+ }
+
+ public virtual long? Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ this.id = value;
+ }
+ }
+
+
+ public virtual User User
+ {
+ get
+ {
+ return user;
+ }
+
+ set
+ {
+ this.user = value;
+ }
+ }
+
+
+ public virtual Resource Resource
+ {
+ get
+ {
+ return resource;
+ }
+
+ set
+ {
+ this.resource = value;
+ }
+ }
+
+
+ public virtual string Description
+ {
+ get
+ {
+ return description;
+ }
+
+ set
+ {
+ this.description = value;
+ }
+ }
+
+
+ public virtual DateTime DueDate
+ {
+ get
+ {
+ return dueDate;
+ }
+
+ set
+ {
+ this.dueDate = value;
+ }
+ }
+
+
+ public virtual DateTime? StartDate
+ {
+ get
+ {
+ return startDate;
+ }
+
+ set
+ {
+ this.startDate = value;
+ }
+ }
+
+
+ public virtual DateTime? CompletionDate
+ {
+ get
+ {
+ return completionDate;
+ }
+
+ set
+ {
+ this.completionDate = value;
+ }
+ }
+
+ }
+
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,45 @@
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ public class User
+ {
+ private long? id;
+ private string name;
+
+ public User()
+ {
+ }
+
+ public User(string name)
+ {
+ this.name = name;
+ }
+
+ public virtual long? Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ this.id = value;
+ }
+ }
+
+ public virtual string Name
+ {
+ get
+ {
+ return name;
+ }
+
+ set
+ {
+ this.name = value;
+ }
+ }
+
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,142 @@
+using System;
+using System.Collections.Generic;
+using Iesi.Collections.Generic;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Conformist;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.Stateless.FetchingLazyCollections
+{
+ public class LazyCollectionFetchTests : TestCaseMappingByCode
+ {
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ModelMapper();
+ mapper.BeforeMapClass += (mi, t, cm) => cm.Id(im => im.Generator(Generators.HighLow));
+ mapper.Class<Animal>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Discriminator(dm => dm.Column("kind"));
+ mc.Property(x => x.Description);
+ });
+ mapper.Subclass<Reptile>(mc => { mc.Property(x => x.BodyTemperature); });
+ mapper.Subclass<Human>(mc =>
+ {
+ mc.Property(x => x.Name);
+ mc.Property(x => x.NickName);
+ mc.Property(x => x.Birthdate, pm => pm.Type(NHibernateUtil.Date));
+ });
+ mapper.AddMapping<FamilyMap<Reptile>>();
+ mapper.AddMapping<FamilyMap<Human>>();
+ var mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ return mappings;
+ }
+
+ #region Nested type: FamilyMap
+
+ private class FamilyMap<T> : ClassMapping<Family<T>> where T : Animal
+ {
+ public FamilyMap()
+ {
+ string familyOf = typeof (T).Name;
+
+ Id(x => x.Id);
+ EntityName(familyOf + "Family");
+ Table("Families");
+ Discriminator(dm => dm.Column("familyKind"));
+ DiscriminatorValue(familyOf);
+ Where(string.Format("familyKind = '{0}'", familyOf));
+ ManyToOne(x => x.Father, map =>
+ {
+ map.Lazy(LazyRelation.NoLazy);
+ map.Class(typeof (T));
+ map.Cascade(Mapping.ByCode.Cascade.All);
+ });
+ ManyToOne(x => x.Mother, map =>
+ {
+ map.Lazy(LazyRelation.NoLazy);
+ map.Class(typeof (T));
+ map.Cascade(Mapping.ByCode.Cascade.All);
+ });
+ Set(x => x.Childs, cam =>
+ {
+ cam.Key(km => km.Column("familyId"));
+ cam.Cascade(Mapping.ByCode.Cascade.All);
+ },
+ rel => rel.OneToMany());
+ }
+ }
+
+ #endregion
+
+ [Test]
+ public void ShouldWorkLoadingComplexEntities()
+ {
+ const string crocodileFather = "Crocodile father";
+ const string crocodileMother = "Crocodile mother";
+
+ using (ISession s = sessions.OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ var rf = new Reptile { Description = crocodileFather };
+ var rm = new Reptile { Description = crocodileMother };
+ var rc1 = new Reptile { Description = "Crocodile" };
+ var rc2 = new Reptile { Description = "Crocodile" };
+ var rfamily = new Family<Reptile>
+ {
+ Father = rf,
+ Mother = rm,
+ Childs = new HashedSet<Reptile> { rc1, rc2 }
...
[truncated message content] |
|
From: <fab...@us...> - 2011-04-23 20:05:09
|
Revision: 5752
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5752&view=rev
Author: fabiomaulo
Date: 2011-04-23 20:05:03 +0000 (Sat, 23 Apr 2011)
Log Message:
-----------
Fix NH-1747
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs
trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs
trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs
Modified: trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-04-23 18:51:34 UTC (rev 5751)
+++ trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-04-23 20:05:03 UTC (rev 5752)
@@ -43,11 +43,11 @@
InitStatementString(elementPersister, alias, batchSize, subquery);
}
- // NH-1747 FIX
- //protected override string GenerateAliasForColumn(string rootAlias, string column)
- //{
- // return elementPersister.GenerateTableAliasForColumn(rootAlias, column);
- //}
+ protected override string GenerateAliasForColumn(string rootAlias, string column)
+ {
+ // NH-1747 FIX (see OneToManyPersister)
+ return elementPersister.GenerateTableAliasForColumn(rootAlias, column);
+ }
private void InitStatementString(IOuterJoinLoadable elementPersister, string alias, int batchSize, SqlString subquery)
{
Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-04-23 18:51:34 UTC (rev 5751)
+++ trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-04-23 20:05:03 UTC (rev 5752)
@@ -321,21 +321,27 @@
.ToString();
}
- // NH-1747 FIX
- //protected override SelectFragment GenerateSelectFragment(string alias, string columnSuffix)
- //{
- // var ojl = (IOuterJoinLoadable)ElementPersister;
- // var selectFragment = new SelectFragment(Dialect).SetSuffix(columnSuffix);
- // var columnNames = KeyColumnNames;
- // var columnAliases = KeyColumnAliases;
- // for (int i = 0; i < columnNames.Length; i++)
- // {
- // var column = columnNames[i];
- // var tableAlias = ojl.GenerateTableAliasForColumn(alias, column);
- // selectFragment.AddColumn(tableAlias, column, columnAliases[i]);
- // }
- // return selectFragment;
- //}
+ protected override SelectFragment GenerateSelectFragment(string alias, string columnSuffix)
+ {
+ /*
+ NH-1747 FIX
+ Note: the fix for NH-1747 may cause some problem when the same ColumnName is used to represent two different properties in the same hierarchy
+ In all our test it happened only for NHibernate.Test.Legacy.MultiTableTest.MultiTableCollections
+ The mapping Multi.hbm.xml had a column named "parent" to represent the Key of a set for the relation Lower->Top and SubMulti->SubMulti everything in the same hierarchy
+ NH TODO: Have to add an early check of same ColumnName used to represent two relations.
+ */
+ var ojl = (IOuterJoinLoadable)ElementPersister;
+ var selectFragment = new SelectFragment(Dialect).SetSuffix(columnSuffix);
+ var columnNames = KeyColumnNames;
+ var columnAliases = KeyColumnAliases;
+ for (int i = 0; i < columnNames.Length; i++)
+ {
+ var column = columnNames[i];
+ var tableAlias = ojl.GenerateTableAliasForColumn(alias, column);
+ selectFragment.AddColumn(tableAlias, column, columnAliases[i]);
+ }
+ return selectFragment;
+ }
/// <summary>
/// Create the <see cref="OneToManyLoader" />
Modified: trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751)
+++ trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml 2011-04-23 20:05:03 UTC (rev 5752)
@@ -62,10 +62,10 @@
<key column="sid"/>
<property name="Amount" column="dupe"/>
<bag name="Children" lazy="true" inverse="true" >
- <key column="parent"/>
+ <key column="parentId"/>
<one-to-many class="NHibernate.DomainModel.SubMulti, NHibernate.DomainModel"/>
</bag>
- <many-to-one name="Parent" column="parent" />
+ <many-to-one name="Parent" column="parentId" />
<list name="MoreChildren" lazy="true">
<key column="another_parent"/>
<index column="list_ind"/>
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-04-23 18:51:34 UTC (rev 5751)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-04-23 20:05:03 UTC (rev 5752)
@@ -43,7 +43,7 @@
}
}
- [Test, Ignore("The fix was commented in the code. Look for NH-1747")]
+ [Test]
public void TraversingBagToJoinChildElementShouldWork()
{
using (ISession session = OpenSession())
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-24 14:19:07
|
Revision: 5755
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5755&view=rev
Author: fabiomaulo
Date: 2011-04-24 14:19:01 +0000 (Sun, 24 Apr 2011)
Log Message:
-----------
Fix NH-2569
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs
Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs 2011-04-23 20:42:26 UTC (rev 5754)
+++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs 2011-04-24 14:19:01 UTC (rev 5755)
@@ -40,12 +40,12 @@
var results = new Dictionary<string, string>();
if (schema != null)
- results.Add(Id.PersistentIdGeneratorParmsNames.Schema, schema);
- else if (mappings.SchemaName != null)
- results.Add(Id.PersistentIdGeneratorParmsNames.Schema, mappings.Dialect.QuoteForSchemaName(mappings.SchemaName));
+ results[Id.PersistentIdGeneratorParmsNames.Schema] = schema;
+ if (mappings.SchemaName != null)
+ results[Id.PersistentIdGeneratorParmsNames.Schema] = mappings.Dialect.QuoteForSchemaName(mappings.SchemaName);
foreach (HbmParam paramSchema in generatorMapping.param ?? new HbmParam[0])
- results.Add(paramSchema.name, paramSchema.GetText());
+ results[paramSchema.name] = paramSchema.GetText();
return results;
}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs 2011-04-24 14:19:01 UTC (rev 5755)
@@ -0,0 +1,38 @@
+using NHibernate.Cfg;
+using NHibernate.Dialect;
+using NHibernate.Mapping;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+namespace NHibernate.Test.NHSpecificTest.NH2569
+{
+ public class MyClass
+ {
+ public virtual int Id { get; set; }
+ }
+
+ public class Fixture
+ {
+ [Test]
+ public void WhenMapHiloToDifferentSchemaThanClassThenIdHasTheMappedSchema()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(cm =>
+ {
+ cm.Schema("aSchema");
+ cm.Id(x => x.Id, idm => idm.Generator(Generators.HighLow, gm => gm.Params(new
+ {
+ table = "hilosequences",
+ schema="gSchema"
+ })));
+ });
+ var conf = new Configuration();
+ conf.DataBaseIntegration(x=> x.Dialect<MsSql2008Dialect>());
+ conf.AddDeserializedMapping(mapper.CompileMappingForAllExplicitAddedEntities(), "wholeDomain");
+
+ var mappings = conf.CreateMappings(Dialect.Dialect.GetDialect());
+ var pc = mappings.GetClass(typeof(MyClass).FullName);
+ ((SimpleValue)pc.Identifier).IdentifierGeneratorProperties["schema"].Should().Be("gSchema");
+ }
+ }
+}
\ 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-23 20:42:26 UTC (rev 5754)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-24 14:19:01 UTC (rev 5755)
@@ -773,6 +773,7 @@
<Compile Include="NHSpecificTest\NH2554\Model.cs" />
<Compile Include="NHSpecificTest\NH2565\Domain.cs" />
<Compile Include="NHSpecificTest\NH2565\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2569\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2580\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2583\AbstractMassTestingFixture.cs" />
<Compile Include="NHSpecificTest\NH2583\Domain.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-25 12:13:06
|
Revision: 5759
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5759&view=rev
Author: fabiomaulo
Date: 2011-04-25 12:12:59 +0000 (Mon, 25 Apr 2011)
Log Message:
-----------
Fix NH-2661 implementing a new drive for MsSQL-2008
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs
trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs
trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs
trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs
trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs
trunk/nhibernate/src/NHibernate/Driver/IDriver.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/App.config
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs
Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -57,7 +57,7 @@
factory = connectionManager.Factory;
}
- private IDriver Driver
+ protected IDriver Driver
{
get { return factory.ConnectionProvider.Driver; }
}
Modified: trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -36,6 +36,7 @@
public override void AddToBatch(IExpectation expectation)
{
IDbCommand cmd = CurrentCommand;
+ Driver.AdjustCommand(cmd);
int rowCount = ExecuteNonQuery(cmd);
expectation.VerifyOutcomeNonBatched(rowCount, cmd);
}
Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -1,5 +1,7 @@
using System.Data;
using System.Data.Common;
+using System.Data.SqlClient;
+using System.Linq;
using System.Text;
using NHibernate.AdoNet.Util;
using NHibernate.Exceptions;
@@ -49,7 +51,7 @@
{
totalExpectedRowsAffected += expectation.ExpectedRowCount;
IDbCommand batchUpdate = CurrentCommand;
-
+ Driver.AdjustCommand(batchUpdate);
string lineWithParameters = null;
var sqlStatementLogger = Factory.Settings.SqlStatementLogger;
if (sqlStatementLogger.IsDebugEnabled || log.IsDebugEnabled)
Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -1,5 +1,7 @@
using System.Data;
+using NHibernate.Cfg;
using NHibernate.Dialect.Function;
+using NHibernate.Driver;
namespace NHibernate.Dialect
{
@@ -30,5 +32,11 @@
RegisterKeyword("time");
RegisterKeyword("hierarchyid");
}
+
+ protected override void RegisterDefaultProperties()
+ {
+ base.RegisterDefaultProperties();
+ DefaultProperties[Environment.ConnectionDriver] = typeof(Sql2008ClientDriver).AssemblyQualifiedName;
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -255,6 +255,7 @@
public void PrepareCommand(IDbCommand command)
{
+ AdjustCommand(command);
OnBeforePrepare(command);
if (SupportsPreparingCommands && prepareSql)
@@ -272,6 +273,19 @@
{
}
+ /// <summary>
+ /// Override to make any adjustments to each IDbCommand object before it added to the batcher.
+ /// </summary>
+ /// <param name="command">The command.</param>
+ /// <remarks>
+ /// This method is similar to the <see cref="OnBeforePrepare"/> but, instead be called just before execute the command (that can be a batch)
+ /// is executed before add each single command to the batcher and before <see cref="OnBeforePrepare"/> .
+ /// If you have to adjust parameters values/type (when the command is full filled) this is a good place where do it.
+ /// </remarks>
+ public virtual void AdjustCommand(IDbCommand command)
+ {
+ }
+
public IDbDataParameter GenerateOutputParameter(IDbCommand command)
{
IDbDataParameter param = GenerateParameter(command, "ReturnValue", SqlTypeFactory.Int32);
Modified: trunk/nhibernate/src/NHibernate/Driver/IDriver.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -73,7 +73,7 @@
/// Prepare the <paramref name="command" /> by calling <see cref="IDbCommand.Prepare()" />.
/// May be a no-op if the driver does not support preparing commands, or for any other reason.
/// </summary>
- /// <param name="command"></param>
+ /// <param name="command">The command.</param>
void PrepareCommand(IDbCommand command);
/// <summary>
@@ -99,5 +99,15 @@
IResultSetsCommand GetResultSetsCommand(ISessionImplementor session);
bool SupportsMultipleQueries { get; }
+
+ /// <summary>
+ /// Make any adjustments to each IDbCommand object before it is added to the batcher.
+ /// </summary>
+ /// <param name="command">The command.</param>
+ /// <remarks>
+ /// This method should be executed before add each single command to the batcher.
+ /// If you have to adjust parameters values/type (when the command is full filled) this is a good place where do it.
+ /// </remarks>
+ void AdjustCommand(IDbCommand command);
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -0,0 +1,28 @@
+using System;
+using System.Data;
+using System.Data.SqlClient;
+using System.Linq;
+
+namespace NHibernate.Driver
+{
+ public class Sql2008ClientDriver : SqlClientDriver
+ {
+ protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlTypes.SqlType sqlType)
+ {
+ base.InitializeParameter(dbParam, name, sqlType);
+ if (sqlType.DbType == DbType.Time)
+ {
+ ((SqlParameter) dbParam).SqlDbType = SqlDbType.Time;
+ }
+ }
+
+ public override void AdjustCommand(IDbCommand command)
+ {
+ foreach (var parameter in command.Parameters.Cast<SqlParameter>().Where(x => x.SqlDbType == SqlDbType.Time && (x.Value is DateTime)))
+ {
+ var dateTimeValue = (DateTime)parameter.Value;
+ parameter.Value = dateTimeValue.TimeOfDay;
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-25 12:12:59 UTC (rev 5759)
@@ -157,6 +157,7 @@
<Compile Include="Driver\OleDbDriver.cs" />
<Compile Include="Driver\OracleClientDriver.cs" />
<Compile Include="Driver\OracleDataClientDriver.cs" />
+ <Compile Include="Driver\Sql2008ClientDriver.cs" />
<Compile Include="Driver\SqlClientDriver.cs" />
<Compile Include="Driver\BasicResultSetsCommand.cs" />
<Compile Include="Driver\SQLiteDriver.cs" />
Modified: trunk/nhibernate/src/NHibernate.Test/App.config
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/App.config 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate.Test/App.config 2011-04-25 12:12:59 UTC (rev 5759)
@@ -53,7 +53,6 @@
<property name="format_sql">true</property>
<!-- This is the System.Data.dll provider for MSSQL Server -->
- <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="connection.connection_string">Server=localhost\sqlexpress;initial catalog=nhibernate;Integrated Security=SSPI</property>
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs 2011-04-25 05:57:46 UTC (rev 5758)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs 2011-04-25 12:12:59 UTC (rev 5759)
@@ -1,5 +1,7 @@
using System;
+using NHibernate.Cfg;
using NHibernate.Dialect;
+using NHibernate.Driver;
using NUnit.Framework;
using SharpTestsEx;
@@ -34,6 +36,13 @@
return dialect is MsSql2008Dialect;
}
+ protected override void Configure(Configuration configuration)
+ {
+ // to be sure we are using the new drive
+ base.Configure(configuration);
+ configuration.DataBaseIntegration(x=> x.Driver<Sql2008ClientDriver>());
+ }
+
[Test, Ignore("workaround to sqlserver DP, not fixed yet")]
public void ShouldBeAbleToQueryEntity()
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-25 13:48:38
|
Revision: 5761
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5761&view=rev
Author: fabiomaulo
Date: 2011-04-25 13:48:32 +0000 (Mon, 25 Apr 2011)
Log Message:
-----------
Fix NH-2551
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs
trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs
Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-04-25 12:15:29 UTC (rev 5760)
+++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-04-25 13:48:32 UTC (rev 5761)
@@ -613,7 +613,7 @@
{
try
{
- clazz = ReflectHelper.ClassForFullName(className);
+ clazz = ReflectHelper.ClassForFullNameOrNull(className);
}
catch (Exception)
{
Modified: trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2011-04-25 12:15:29 UTC (rev 5760)
+++ trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2011-04-25 13:48:32 UTC (rev 5761)
@@ -192,37 +192,53 @@
/// the method try to find the System.Type scanning all Assemblies of the <see cref="AppDomain.CurrentDomain"/>.
/// </remarks>
/// <exception cref="TypeLoadException">If no System.Type was found for <paramref name="classFullName"/>.</exception>
- public static System.Type ClassForFullName(string classFullName)
+ public static System.Type ClassForFullName(string classFullName)
{
- System.Type result = null;
- AssemblyQualifiedTypeName parsedName = TypeNameParser.Parse(classFullName);
- if (!string.IsNullOrEmpty(parsedName.Assembly))
- {
- result = TypeFromAssembly(parsedName, false);
- }
- else
- {
- if (!string.IsNullOrEmpty(classFullName))
- {
- Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();
- foreach (Assembly a in ass)
- {
- result = a.GetType(classFullName, false, false);
- if (result != null)
- break; //<<<<<================
- }
- }
- }
- if (result == null)
- {
- string message = "Could not load type " + classFullName + ". Possible cause: the assembly was not loaded or not specified.";
- throw new TypeLoadException(message);
- }
+ var result = ClassForFullNameOrNull(classFullName);
+ if (result == null)
+ {
+ string message = "Could not load type " + classFullName + ". Possible cause: the assembly was not loaded or not specified.";
+ throw new TypeLoadException(message);
+ }
- return result;
+ return result;
}
- public static System.Type TypeFromAssembly(string type, string assembly, bool throwIfError)
+ /// <summary>
+ /// Load a System.Type given is't name.
+ /// </summary>
+ /// <param name="classFullName">The class FullName or AssemblyQualifiedName</param>
+ /// <returns>The System.Type or null</returns>
+ /// <remarks>
+ /// If the <paramref name="classFullName"/> don't represent an <see cref="System.Type.AssemblyQualifiedName"/>
+ /// the method try to find the System.Type scanning all Assemblies of the <see cref="AppDomain.CurrentDomain"/>.
+ /// </remarks>
+ public static System.Type ClassForFullNameOrNull(string classFullName)
+ {
+ System.Type result = null;
+ AssemblyQualifiedTypeName parsedName = TypeNameParser.Parse(classFullName);
+ if (!string.IsNullOrEmpty(parsedName.Assembly))
+ {
+ result = TypeFromAssembly(parsedName, false);
+ }
+ else
+ {
+ if (!string.IsNullOrEmpty(classFullName))
+ {
+ Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();
+ foreach (Assembly a in ass)
+ {
+ result = a.GetType(classFullName, false, false);
+ if (result != null)
+ break; //<<<<<================
+ }
+ }
+ }
+
+ return result;
+ }
+
+ public static System.Type TypeFromAssembly(string type, string assembly, bool throwIfError)
{
return TypeFromAssembly(new AssemblyQualifiedTypeName(type, assembly), throwIfError);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-25 21:13:29
|
Revision: 5762
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5762&view=rev
Author: fabiomaulo
Date: 2011-04-25 21:13:23 +0000 (Mon, 25 Apr 2011)
Log Message:
-----------
Fix NH-2505
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs
Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2011-04-25 13:48:32 UTC (rev 5761)
+++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2011-04-25 21:13:23 UTC (rev 5762)
@@ -213,17 +213,7 @@
// Need to check for boolean equality
if (lhs is HqlBooleanExpression || rhs is HqlBooleanExpression)
{
- lhs =
- _hqlTreeBuilder.Case(
- new [] { _hqlTreeBuilder.When(lhs, _hqlTreeBuilder.Constant(true)) },
- _hqlTreeBuilder.Constant(false));
-
- rhs =
- _hqlTreeBuilder.Case(
- new [] { _hqlTreeBuilder.When(rhs, _hqlTreeBuilder.Constant(true)) },
- _hqlTreeBuilder.Constant(false));
-
- return _hqlTreeBuilder.Equality(lhs, rhs);
+ return ResolveBooleanEquality(expression, lhs, rhs, (l, r) => _hqlTreeBuilder.Equality(l, r));
}
// Check for nulls on left or right.
@@ -246,23 +236,12 @@
case ExpressionType.NotEqual:
// Need to check for boolean in-equality
- if (lhs is HqlBooleanExpression || rhs is HqlBooleanExpression)
- {
- lhs =
- _hqlTreeBuilder.Case(
- new [] { _hqlTreeBuilder.When(lhs, _hqlTreeBuilder.Constant(true)) },
- _hqlTreeBuilder.Constant(false));
+ if (lhs is HqlBooleanExpression || rhs is HqlBooleanExpression)
+ {
+ return ResolveBooleanEquality(expression, lhs, rhs, (l, r) => _hqlTreeBuilder.Inequality(l, r));
+ }
- rhs =
- _hqlTreeBuilder.Case(
- new [] { _hqlTreeBuilder.When(rhs, _hqlTreeBuilder.Constant(true)) },
- _hqlTreeBuilder.Constant(false));
-
- return _hqlTreeBuilder.Inequality(lhs, rhs);
-
- }
-
- // Check for nulls on left or right.
+ // Check for nulls on left or right.
if (expression.Right is ConstantExpression
&& expression.Right.Type.IsNullableOrReference()
&& ((ConstantExpression)expression.Right).Value == null)
@@ -330,7 +309,49 @@
throw new InvalidOperationException();
}
- protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
+ private HqlTreeNode ResolveBooleanEquality(BinaryExpression expression, HqlExpression lhs, HqlExpression rhs,
+ Func<HqlExpression, HqlExpression, HqlTreeNode> applyResultExpressions)
+ {
+ if (!(lhs is HqlBooleanExpression) && !(rhs is HqlBooleanExpression))
+ {
+ throw new InvalidOperationException("Invalid operators for ResolveBooleanEquality, this may indicate a bug in NHibernate");
+ }
+
+ HqlExpression leftHqlExpression = GetExpressionForBooleanEquality(expression.Left, lhs);
+ HqlExpression rightHqlExpression = GetExpressionForBooleanEquality(expression.Right, rhs);
+ return applyResultExpressions(leftHqlExpression, rightHqlExpression);
+ }
+
+ private HqlExpression GetExpressionForBooleanEquality(Expression @operator, HqlExpression original)
+ {
+ //When the expression is a constant then use the constant
+ var operandEx = @operator as ConstantExpression;
+ if (operandEx != null)
+ {
+ NamedParameter namedParameter;
+ if (_parameters.ConstantToParameterMap.TryGetValue(operandEx, out namedParameter))
+ {
+ _parameters.RequiredHqlParameters.Add(new NamedParameterDescriptor(namedParameter.Name, null, new[] { _parameters.RequiredHqlParameters.Count + 1 }, false));
+ return _hqlTreeBuilder.Parameter(namedParameter.Name).AsExpression();
+ }
+
+ return _hqlTreeBuilder.Constant(operandEx.Value);
+ }
+
+ //When the expression is a member-access not nullable then use the HbmDot
+ var memberAccessExpression = @operator as MemberExpression;
+ if (ExpressionType.MemberAccess.Equals(@operator.NodeType) && memberAccessExpression != null && typeof(bool).Equals(memberAccessExpression.Type))
+ {
+ // this case make the difference when the property "Value" of a nullable type is used (ignore the null since the user is explicity checking the Value)
+ return original;
+ }
+
+ //When the expression is a member-access nullable then use the "case" clause to transform it to boolean (to use always .NET meaning instead leave the DB the behavior for null)
+ //When the expression is a complex-expression then use the "case" clause to transform it to boolean
+ return _hqlTreeBuilder.Case(new[] {_hqlTreeBuilder.When(original, _hqlTreeBuilder.Constant(true))}, _hqlTreeBuilder.Constant(false));
+ }
+
+ protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
{
switch (expression.NodeType)
{
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs 2011-04-25 21:13:23 UTC (rev 5762)
@@ -0,0 +1,175 @@
+using System;
+using System.Linq;
+using System.Text.RegularExpressions;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Linq;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.NHSpecificTest.NH2505
+{
+ public class MyClass
+ {
+ public virtual Guid Id { get; set; }
+ public virtual bool Alive { get; set; }
+ public virtual bool? MayBeAlive { get; set; }
+ public virtual int Something { get; set; }
+ }
+ public class Fixture: TestCaseMappingByCode
+ {
+ private Regex caseClause = new Regex("case",RegexOptions.IgnoreCase);
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.BeforeMapClass += (mi, t, x) => x.Id(map=> map.Generator(Generators.Guid));
+ return mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ }
+
+ private class Scenario: IDisposable
+ {
+ private readonly ISessionFactory factory;
+
+ public Scenario(ISessionFactory factory)
+ {
+ this.factory = factory;
+ using (var session= factory.OpenSession())
+ {
+ session.Save(new MyClass { Alive = true });
+ session.Save(new MyClass { Alive = false, MayBeAlive = true });
+ session.Flush();
+ }
+ }
+
+ public void Dispose()
+ {
+ using (var session = factory.OpenSession())
+ {
+ session.CreateQuery("delete from MyClass").ExecuteUpdate();
+ session.Flush();
+ }
+ }
+ }
+
+ [Test]
+ public void WhenQueryConstantEqualToMemberThenDoesNotUseTheCaseConstructor()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ {
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => x.Alive == false).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0);
+ }
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => true == x.Alive).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0);
+ }
+ }
+ }
+ }
+
+ [Test]
+ public void WhenQueryConstantNotEqualToMemberThenDoesNotUseTheCaseConstructor()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ {
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => x.Alive != false).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0);
+ }
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => true != x.Alive).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0);
+ }
+ }
+ }
+ }
+
+ [Test]
+ public void WhenQueryComplexEqualToComplexThentUseTheCaseConstructorForBoth()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ {
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => (5 > x.Something) == (x.Something < 10)).ToList();
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(2);
+ }
+ }
+ }
+ }
+
+ [Test]
+ public void WhenQueryConstantEqualToNullableMemberThenUseTheCaseConstructorForMember()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ {
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => x.MayBeAlive == false).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1);
+ }
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => true == x.MayBeAlive).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1);
+ }
+ }
+ }
+ }
+
+ [Test]
+ public void WhenQueryConstantEqualToNullableMemberValueThenDoesNotUseTheCaseConstructorForMember()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ {
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => x.MayBeAlive.Value == false).ToList();
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1);
+ }
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => true == x.MayBeAlive.Value).ToList();
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1);
+ }
+ }
+ }
+ }
+
+ [Test]
+ public void WhenQueryConstantNotEqualToNullableMemberThenUseTheCaseConstructorForMember()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ {
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => x.MayBeAlive != false).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1);
+ }
+ using (var sqls = new SqlLogSpy())
+ {
+ session.Query<MyClass>().Where(x => true != x.MayBeAlive).Should().Have.Count.EqualTo(1);
+ caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1);
+ }
+ }
+ }
+ }
+ }
+}
\ 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-25 13:48:32 UTC (rev 5761)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-25 21:13:23 UTC (rev 5762)
@@ -763,6 +763,7 @@
<Compile Include="NHSpecificTest\NH2490\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2490\Model.cs" />
<Compile Include="NHSpecificTest\NH2491\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2505\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2507\Animal.cs" />
<Compile Include="NHSpecificTest\NH2507\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2527\FixtureWithNoBatcher.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-26 13:58:22
|
Revision: 5765
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5765&view=rev
Author: fabiomaulo
Date: 2011-04-26 13:58:16 +0000 (Tue, 26 Apr 2011)
Log Message:
-----------
Fix NH-2674
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs
trunk/nhibernate/src/NHibernate/ISession.cs
trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs
Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-04-25 23:01:50 UTC (rev 5764)
+++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-04-26 13:58:16 UTC (rev 5765)
@@ -31,6 +31,16 @@
return new QueryOver<T,T>(alias);
}
+ public static QueryOver<T, T> Of<T>(string entityName)
+ {
+ return new QueryOver<T, T>(entityName);
+ }
+
+ public static QueryOver<T, T> Of<T>(string entityName, Expression<Func<T>> alias)
+ {
+ return new QueryOver<T, T>(entityName, alias);
+ }
+
public ICriteria UnderlyingCriteria
{
get { return criteria; }
@@ -275,6 +285,12 @@
criteria = impl;
}
+ protected internal QueryOver(string entityName)
+ {
+ impl = new CriteriaImpl(entityName, null);
+ criteria = impl;
+ }
+
protected internal QueryOver(Expression<Func<TSubType>> alias)
{
string aliasPath = ExpressionProcessor.FindMemberExpression(alias.Body);
@@ -282,6 +298,13 @@
criteria = impl;
}
+ protected internal QueryOver(string entityName, Expression<Func<TSubType>> alias)
+ {
+ string aliasPath = ExpressionProcessor.FindMemberExpression(alias.Body);
+ impl = new CriteriaImpl(entityName, aliasPath, null);
+ criteria = impl;
+ }
+
protected internal QueryOver(CriteriaImpl impl)
{
this.impl = impl;
Modified: trunk/nhibernate/src/NHibernate/ISession.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/ISession.cs 2011-04-25 23:01:50 UTC (rev 5764)
+++ trunk/nhibernate/src/NHibernate/ISession.cs 2011-04-26 13:58:16 UTC (rev 5765)
@@ -714,17 +714,35 @@
/// Creates a new <c>IQueryOver<T></c> for the entity class.
/// </summary>
/// <typeparam name="T">The entity class</typeparam>
- /// <returns>An ICriteria<T> object</returns>
+ /// <returns>An IQueryOver<T> object</returns>
IQueryOver<T,T> QueryOver<T>() where T : class;
/// <summary>
/// Creates a new <c>IQueryOver<T></c> for the entity class.
/// </summary>
/// <typeparam name="T">The entity class</typeparam>
- /// <returns>An ICriteria<T> object</returns>
+ /// <param name="alias">The alias of the entity</param>
+ /// <returns>An IQueryOver<T> object</returns>
IQueryOver<T,T> QueryOver<T>(Expression<Func<T>> alias) where T : class;
/// <summary>
+ /// Creates a new <c>IQueryOver{T};</c> for the entity class.
+ /// </summary>
+ /// <typeparam name="T">The entity class</typeparam>
+ /// <param name="entityName">The name of the entity to Query</param>
+ /// <returns>An IQueryOver{T} object</returns>
+ IQueryOver<T, T> QueryOver<T>(string entityName) where T : class;
+
+ /// <summary>
+ /// Creates a new <c>IQueryOver{T}</c> for the entity class.
+ /// </summary>
+ /// <typeparam name="T">The entity class</typeparam>
+ /// <param name="entityName">The name of the entity to Query</param>
+ /// <param name="alias">The alias of the entity</param>
+ /// <returns>An IQueryOver{T} object</returns>
+ IQueryOver<T, T> QueryOver<T>(string entityName, Expression<Func<T>> alias) where T : class;
+
+ /// <summary>
/// Create a new instance of <c>Query</c> for the given query string
/// </summary>
/// <param name="queryString">A hibernate query string</param>
Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2011-04-25 23:01:50 UTC (rev 5764)
+++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2011-04-26 13:58:16 UTC (rev 5765)
@@ -1862,6 +1862,25 @@
}
}
+ public IQueryOver<T, T> QueryOver<T>(string entityName) where T : class
+ {
+ using (new SessionIdLoggingContext(SessionId))
+ {
+ CheckAndUpdateSessionStatus();
+ return new QueryOver<T, T>(new CriteriaImpl(entityName, this));
+ }
+ }
+
+ public IQueryOver<T, T> QueryOver<T>(string entityName, Expression<Func<T>> alias) where T : class
+ {
+ using (new SessionIdLoggingContext(SessionId))
+ {
+ CheckAndUpdateSessionStatus();
+ string aliasPath = ExpressionProcessor.FindMemberExpression(alias.Body);
+ return new QueryOver<T, T>(new CriteriaImpl(entityName, aliasPath, this));
+ }
+ }
+
public override IList List(CriteriaImpl criteria)
{
using (new SessionIdLoggingContext(SessionId))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-26 17:18:06
|
Revision: 5766
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5766&view=rev
Author: fabiomaulo
Date: 2011-04-26 17:17:59 +0000 (Tue, 26 Apr 2011)
Log Message:
-----------
preparing the painful note (composite-id)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs 2011-04-26 17:17:59 UTC (rev 5766)
@@ -0,0 +1,28 @@
+namespace NHibernate.Mapping.ByCode
+{
+ public interface ICompositeIdAttributesMapper {}
+
+ public interface ICompositeIdMapper : ICompositeIdAttributesMapper, IMinimalPlainPropertyContainerMapper {}
+
+ public interface IComponentAsIdAttributesMapper : IAccessorPropertyMapper
+ {
+ /// <summary>
+ /// Force the component to a different type than the one of the property.
+ /// </summary>
+ /// <param name="componentType">Mapped component type.</param>
+ /// <remarks>
+ /// Useful when the property is an interface and you need the mapping to a concrete class mapped as component.
+ /// </remarks>
+ void Class(System.Type componentType);
+ }
+
+ public interface IComponentAsIdMapper : IComponentAsIdAttributesMapper, IMinimalPlainPropertyContainerMapper { }
+
+ public interface IComponentAsIdAttributesMapper<TComponent> : IAccessorPropertyMapper
+ {
+ void Class<TConcrete>() where TConcrete : TComponent;
+ }
+
+ public interface IComponentAsIdMapper<TComponent> : IComponentAsIdAttributesMapper<TComponent>, IMinimalPlainPropertyContainerMapper<TComponent> where TComponent : class { }
+
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-26 13:58:16 UTC (rev 5765)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-26 17:17:59 UTC (rev 5766)
@@ -5,14 +5,17 @@
namespace NHibernate.Mapping.ByCode
{
- public interface IBasePlainPropertyContainerMapper
+ public interface IMinimalPlainPropertyContainerMapper
{
void Property(MemberInfo property, Action<IPropertyMapper> mapping);
+ void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping);
+ }
+ public interface IBasePlainPropertyContainerMapper : IMinimalPlainPropertyContainerMapper
+ {
void Component(MemberInfo property, Action<IComponentMapper> mapping);
void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping);
- void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping);
void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping);
}
@@ -21,12 +24,18 @@
void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping);
}
- public interface IBasePlainPropertyContainerMapper<TContainer>
+ public interface IMinimalPlainPropertyContainerMapper<TContainer>
{
void Property<TProperty>(Expression<Func<TContainer, TProperty>> property);
void Property<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IPropertyMapper> mapping);
void Property(FieldInfo member, Action<IPropertyMapper> mapping);
+ void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class;
+ void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property) where TProperty : class;
+ }
+
+ public interface IBasePlainPropertyContainerMapper<TContainer> : IMinimalPlainPropertyContainerMapper<TContainer>
+ {
void Component<TComponent>(Expression<Func<TContainer, TComponent>> property,
Action<IComponentMapper<TComponent>> mapping) where TComponent : class;
void Component<TComponent>(Expression<Func<TContainer, TComponent>> property) where TComponent : class;
@@ -35,9 +44,6 @@
TComponent dynamicComponentTemplate,
Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class;
- void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class;
- void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property) where TProperty : class;
-
void Any<TProperty>(Expression<Func<TContainer, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class;
}
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 13:58:16 UTC (rev 5765)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 17:17:59 UTC (rev 5766)
@@ -295,6 +295,7 @@
<Compile Include="Mapping\ByCode\Conformist\JoinedSubclassMapping.cs" />
<Compile Include="Mapping\ByCode\Conformist\SubclassMapping.cs" />
<Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" />
+ <Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" />
<Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-26 19:20:46
|
Revision: 5768
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5768&view=rev
Author: fabiomaulo
Date: 2011-04-26 19:20:39 +0000 (Tue, 26 Apr 2011)
Log Message:
-----------
ComposedIdMapper
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-26 19:20:39 UTC (rev 5768)
@@ -0,0 +1,52 @@
+using System;
+using System.Linq;
+using System.Reflection;
+using NHibernate.Cfg.MappingSchema;
+
+namespace NHibernate.Mapping.ByCode.Impl
+{
+ public class ComposedIdMapper : IComposedIdMapper
+ {
+ private readonly HbmCompositeId id;
+ private readonly HbmMapping mapDoc;
+
+ public ComposedIdMapper(HbmCompositeId id, HbmMapping mapDoc)
+ {
+ this.id = id;
+ this.mapDoc = mapDoc;
+ }
+
+ public HbmCompositeId ComposedId
+ {
+ get { return id; }
+ }
+
+ #region IComposedIdMapper Members
+
+ public void Property(MemberInfo property, Action<IPropertyMapper> mapping)
+ {
+ var hbmProperty = new HbmKeyProperty {name = property.Name};
+ mapping(new KeyPropertyMapper(property, hbmProperty));
+ AddProperty(hbmProperty);
+ }
+
+ public void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping)
+ {
+ var hbm = new HbmKeyManyToOne {name = property.Name};
+ mapping(new KeyManyToOneMapper(property, hbm, mapDoc));
+ AddProperty(hbm);
+ }
+
+ #endregion
+
+ protected void AddProperty(object property)
+ {
+ if (property == null)
+ {
+ throw new ArgumentNullException("property");
+ }
+ var toAdd = new[] {property};
+ id.Items = id.Items == null ? toAdd : id.Items.Concat(toAdd).ToArray();
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 17:36:57 UTC (rev 5767)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 19:20:39 UTC (rev 5768)
@@ -297,6 +297,7 @@
<Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" />
<Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" />
<Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" />
+ <Compile Include="Mapping\ByCode\Impl\ComposedIdMapper.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" />
<Compile Include="Mapping\ByCode\PropertyToField.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-26 19:20:39 UTC (rev 5768)
@@ -0,0 +1,76 @@
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests
+{
+ public class ComposedIdMapperTests
+ {
+ private class Person
+ {
+ public string Email { get; set; }
+ public User User { get; set; }
+ }
+
+ private class User
+ {
+ public int Id { get; set; }
+ }
+
+ [Test]
+ public void CanMapProperty()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComposedIdMapper(compositeId, mapdoc);
+
+ mapper.Property(For<Person>.Property(ts => ts.Email), x => { });
+
+ compositeId.Items.Should().Have.Count.EqualTo(1);
+ compositeId.Items.First().Should().Be.OfType<HbmKeyProperty>();
+ compositeId.Items.OfType<HbmKeyProperty>().First().Name.Should().Be.EqualTo("Email");
+ }
+
+ [Test]
+ public void CallPropertyMapper()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComposedIdMapper(compositeId, mapdoc);
+ var called = false;
+
+ mapper.Property(For<Person>.Property(ts => ts.Email), x => called = true);
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void CanMapManyToOne()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComposedIdMapper(compositeId, mapdoc);
+
+ mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => { });
+
+ compositeId.Items.Should().Have.Count.EqualTo(1);
+ compositeId.Items.First().Should().Be.OfType<HbmKeyManyToOne>();
+ compositeId.Items.OfType<HbmKeyManyToOne>().First().Name.Should().Be.EqualTo("User");
+ }
+
+ [Test]
+ public void CallMapManyToOneMapper()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComposedIdMapper(compositeId, mapdoc);
+ var called = false;
+
+ mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => called = true);
+
+ called.Should().Be.True();
+ }
+ }
+}
\ 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-26 17:36:57 UTC (rev 5767)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 19:20:39 UTC (rev 5768)
@@ -551,6 +551,7 @@
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\ComposedIdMapperTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-26 22:15:57
|
Revision: 5769
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5769&view=rev
Author: fabiomaulo
Date: 2011-04-26 22:15:51 +0000 (Tue, 26 Apr 2011)
Log Message:
-----------
ComponentAsIdMapper
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs 2011-04-26 22:15:51 UTC (rev 5769)
@@ -0,0 +1,66 @@
+using System;
+using System.Linq;
+using System.Reflection;
+using NHibernate.Cfg.MappingSchema;
+
+namespace NHibernate.Mapping.ByCode.Impl
+{
+ public class ComponentAsIdMapper: IComponentAsIdMapper
+ {
+ private readonly IAccessorPropertyMapper accessorPropertyMapper;
+ private readonly HbmCompositeId id;
+ private readonly HbmMapping mapDoc;
+
+ public ComponentAsIdMapper(System.Type componentType, MemberInfo declaringTypeMember, HbmCompositeId id, HbmMapping mapDoc)
+ {
+ this.id = id;
+ this.mapDoc = mapDoc;
+ id.@class = componentType.GetShortClassName(mapDoc);
+ accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => id.access = x);
+ }
+
+ public HbmCompositeId CompositeId
+ {
+ get { return id; }
+ }
+
+ public void Access(Accessor accessor)
+ {
+ accessorPropertyMapper.Access(accessor);
+ }
+
+ public void Access(System.Type accessorType)
+ {
+ accessorPropertyMapper.Access(accessorType);
+ }
+
+ public void Class(System.Type componentType)
+ {
+ id.@class = componentType.GetShortClassName(mapDoc);
+ }
+
+ public void Property(MemberInfo property, Action<IPropertyMapper> mapping)
+ {
+ var hbmProperty = new HbmKeyProperty { name = property.Name };
+ mapping(new KeyPropertyMapper(property, hbmProperty));
+ AddProperty(hbmProperty);
+ }
+
+ public void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping)
+ {
+ var hbm = new HbmKeyManyToOne { name = property.Name };
+ mapping(new KeyManyToOneMapper(property, hbm, mapDoc));
+ AddProperty(hbm);
+ }
+
+ protected void AddProperty(object property)
+ {
+ if (property == null)
+ {
+ throw new ArgumentNullException("property");
+ }
+ var toAdd = new[] { property };
+ id.Items = id.Items == null ? toAdd : id.Items.Concat(toAdd).ToArray();
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 19:20:39 UTC (rev 5768)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 22:15:51 UTC (rev 5769)
@@ -297,6 +297,7 @@
<Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" />
<Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" />
<Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" />
+ <Compile Include="Mapping\ByCode\Impl\ComponentAsIdMapper.cs" />
<Compile Include="Mapping\ByCode\Impl\ComposedIdMapper.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs 2011-04-26 22:15:51 UTC (rev 5769)
@@ -0,0 +1,93 @@
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests
+{
+ public class ComponentAsIdTests
+ {
+ private class PersonId
+ {
+ public string Email { get; set; }
+ public User User { get; set; }
+ }
+
+ private class Person
+ {
+ public PersonId Id { get; set; }
+ public string Name { get; set; }
+ }
+
+ private class User
+ {
+ public int Id { get; set; }
+ }
+
+ [Test]
+ public void WhenCreatedThenSetTheComponentClass()
+ {
+ var mapdoc = new HbmMapping();
+ var component = new HbmCompositeId();
+ new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x=> x.Id), component, mapdoc);
+
+ com...@cl...().Contain("PersonId");
+ }
+
+ [Test]
+ public void CanMapProperty()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);
+
+ mapper.Property(For<PersonId>.Property(ts => ts.Email), x => { });
+
+ compositeId.Items.Should().Have.Count.EqualTo(1);
+ compositeId.Items.First().Should().Be.OfType<HbmKeyProperty>();
+ compositeId.Items.OfType<HbmKeyProperty>().First().Name.Should().Be.EqualTo("Email");
+ }
+
+ [Test]
+ public void CallPropertyMapper()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);
+ var called = false;
+
+ mapper.Property(For<PersonId>.Property(ts => ts.Email), x => called = true);
+
+ called.Should().Be.True();
+ }
+
+ [Test]
+ public void CanMapManyToOne()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);
+
+ mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => { });
+
+ compositeId.Items.Should().Have.Count.EqualTo(1);
+ compositeId.Items.First().Should().Be.OfType<HbmKeyManyToOne>();
+ compositeId.Items.OfType<HbmKeyManyToOne>().First().Name.Should().Be.EqualTo("User");
+ }
+
+ [Test]
+ public void CallMapManyToOneMapper()
+ {
+ var mapdoc = new HbmMapping();
+ var compositeId = new HbmCompositeId();
+ var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);
+ var called = false;
+
+ mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => called = true);
+
+ called.Should().Be.True();
+ }
+
+ }
+}
\ 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-26 19:20:39 UTC (rev 5768)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 22:15:51 UTC (rev 5769)
@@ -551,6 +551,7 @@
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\ComponentAsIdTests.cs" />
<Compile Include="MappingByCode\MappersTests\ComposedIdMapperTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" />
<Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-27 12:09:01
|
Revision: 5771
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5771&view=rev
Author: fabiomaulo
Date: 2011-04-27 12:08:50 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
ClassMapper with ComponentAsId and ComposedId
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 09:49:57 UTC (rev 5770)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771)
@@ -8,6 +8,10 @@
{
void Id(Action<IIdMapper> idMapper);
void Id(MemberInfo idProperty, Action<IIdMapper> idMapper);
+
+ void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> idMapper);
+ void ComposedId(Action<IComposedIdMapper> idPropertiesMapping);
+
void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping);
void DiscriminatorValue(object value);
void Table(string tableName);
@@ -37,6 +41,12 @@
void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty);
void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty, Action<IIdMapper> idMapper);
void Id(FieldInfo idProperty, Action<IIdMapper> idMapper);
+
+ //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class;
+ //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class;
+
+ //void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping);
+
void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping);
void DiscriminatorValue(object value);
void Table(string tableName);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 09:49:57 UTC (rev 5770)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771)
@@ -68,6 +68,32 @@
mapper(new IdMapper(idProperty, id));
}
+ public void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> mapper)
+ {
+ if (!IsMemberSupportedByMappedContainer(idProperty))
+ {
+ throw new ArgumentOutOfRangeException("idProperty", "Can't use, as component id property, a property of another graph");
+ }
+ var id = classMapping.Item as HbmCompositeId;
+ if(id == null)
+ {
+ id = new HbmCompositeId();
+ classMapping.Item = id;
+ }
+ mapper(new ComponentAsIdMapper(idProperty.GetPropertyOrFieldType(), idProperty, id, mapDoc));
+ }
+
+ public void ComposedId(Action<IComposedIdMapper> idPropertiesMapping)
+ {
+ var id = classMapping.Item as HbmCompositeId;
+ if (id == null)
+ {
+ id = new HbmCompositeId();
+ classMapping.Item = id;
+ }
+ idPropertiesMapping(new ComposedIdMapper(Container, id, mapDoc));
+ }
+
public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping)
{
if (discriminatorMapper == null)
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-27 09:49:57 UTC (rev 5770)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-27 12:08:50 UTC (rev 5771)
@@ -7,11 +7,13 @@
{
public class ComposedIdMapper : IComposedIdMapper
{
+ private readonly System.Type container;
private readonly HbmCompositeId id;
private readonly HbmMapping mapDoc;
- public ComposedIdMapper(HbmCompositeId id, HbmMapping mapDoc)
+ public ComposedIdMapper(System.Type container, HbmCompositeId id, HbmMapping mapDoc)
{
+ this.container = container;
this.id = id;
this.mapDoc = mapDoc;
}
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs 2011-04-27 12:08:50 UTC (rev 5771)
@@ -0,0 +1,85 @@
+using System;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests
+{
+ public class ComponetAsIdTests
+ {
+ private class PersonId
+ {
+ public string Email { get; set; }
+ public User User { get; set; }
+ }
+
+ private class Person
+ {
+ private PersonId id;
+ public PersonId Id
+ {
+ get { return id; }
+ }
+
+ public string Name { get; set; }
+ }
+
+ private class User
+ {
+ public int Id { get; set; }
+ }
+
+ [Test]
+ public void WhenClassWithComponentIdThenTheIdIsConpositeId()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.ComponentAsId(For<Person>.Property(x => x.Id), map =>
+ {
+ map.Property(For<PersonId>.Property(x => x.Email), pm => { });
+ map.ManyToOne(For<PersonId>.Property(x => x.User), pm => { });
+ });
+ var hbmClass = mapdoc.RootClasses[0];
+ hbmClass.Id.Should().Be.Null();
+ var hbmCompositeId = hbmClass.CompositeId;
+ hbmCompositeId.Should().Not.Be.Null();
+ hbm...@cl...().Not.Be.Null();
+ hbmCompositeId.Items.Should().Have.Count.EqualTo(2);
+ hbmCompositeId.Items.Select(x => x.GetType()).Should().Have.SameValuesAs(typeof(HbmKeyProperty),typeof(HbmKeyManyToOne));
+ }
+
+ [Test]
+ public void WhenComponentIdCustomizedMoreThanOnceThenMerge()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.ComponentAsId(For<Person>.Property(x => x.Id), map =>
+ {
+ map.Property(For<PersonId>.Property(x => x.Email), pm => { });
+ map.ManyToOne(For<PersonId>.Property(x => x.User), pm => { });
+ });
+ mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Access(Accessor.Field));
+
+ var hbmClass = mapdoc.RootClasses[0];
+ hbmClass.Id.Should().Be.Null();
+ var hbmCompositeId = hbmClass.CompositeId;
+ hbmCompositeId.Items.Should().Have.Count.EqualTo(2);
+ hbmCompositeId.access.Should().Contain("field");
+ }
+
+ [Test]
+ public void WhenMapExternalMemberAsComponentIdThenThrows()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.Executing(m => m.ComponentAsId(For<User>.Property(x => x.Id), map => map.Access(Accessor.Field))).Throws<ArgumentOutOfRangeException>();
+ }
+
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs 2011-04-27 12:08:50 UTC (rev 5771)
@@ -0,0 +1,57 @@
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests
+{
+ public class ComposedIdTests
+ {
+ private class Person
+ {
+ public string Email { get; set; }
+ public User User { get; set; }
+ }
+
+ private class User
+ {
+ public int Id { get; set; }
+ }
+
+ [Test]
+ public void WhenClassWithComposedIdThenTheIdIsConpositeId()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, null);
+
+ mapper.ComposedId(map =>
+ {
+ map.Property(For<Person>.Property(x => x.Email), pm => { });
+ map.ManyToOne(For<Person>.Property(x => x.User), pm => { });
+ });
+ var hbmClass = mapdoc.RootClasses[0];
+ hbmClass.Id.Should().Be.Null();
+ var hbmCompositeId = hbmClass.CompositeId;
+ hbmCompositeId.Should().Not.Be.Null();
+ hbm...@cl...().Be.Null();
+ hbmCompositeId.Items.Should().Have.Count.EqualTo(2);
+ hbmCompositeId.Items.Select(x => x.GetType()).Should().Have.SameValuesAs(typeof(HbmKeyProperty), typeof(HbmKeyManyToOne));
+ }
+
+ [Test]
+ public void WhenComposedIdCustomizedMoreThanOnceThenMerge()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, null);
+
+ mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Email), pm => { }));
+ mapper.ComposedId(map => map.ManyToOne(For<Person>.Property(x => x.User), pm => { }));
+
+ var hbmClass = mapdoc.RootClasses[0];
+ hbmClass.Id.Should().Be.Null();
+ var hbmCompositeId = hbmClass.CompositeId;
+ hbmCompositeId.Items.Should().Have.Count.EqualTo(2);
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-27 09:49:57 UTC (rev 5770)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-27 12:08:50 UTC (rev 5771)
@@ -24,7 +24,7 @@
{
var mapdoc = new HbmMapping();
var compositeId = new HbmCompositeId();
- var mapper = new ComposedIdMapper(compositeId, mapdoc);
+ var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);
mapper.Property(For<Person>.Property(ts => ts.Email), x => { });
@@ -38,7 +38,7 @@
{
var mapdoc = new HbmMapping();
var compositeId = new HbmCompositeId();
- var mapper = new ComposedIdMapper(compositeId, mapdoc);
+ var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);
var called = false;
mapper.Property(For<Person>.Property(ts => ts.Email), x => called = true);
@@ -51,7 +51,7 @@
{
var mapdoc = new HbmMapping();
var compositeId = new HbmCompositeId();
- var mapper = new ComposedIdMapper(compositeId, mapdoc);
+ var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);
mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => { });
@@ -65,7 +65,7 @@
{
var mapdoc = new HbmMapping();
var compositeId = new HbmCompositeId();
- var mapper = new ComposedIdMapper(compositeId, mapdoc);
+ var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);
var called = false;
mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => called = true);
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 09:49:57 UTC (rev 5770)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 12:08:50 UTC (rev 5771)
@@ -549,6 +549,8 @@
<Compile Include="MappingByCode\For.cs" />
<Compile Include="MappingByCode\MappersTests\AbstractPropertyContainerMapperTest.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\ClassMapperWithJoinPropertiesTest.cs" />
+ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComponetAsIdTests.cs" />
+ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComposedIdTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-27 13:51:46
|
Revision: 5772
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5772&view=rev
Author: fabiomaulo
Date: 2011-04-27 13:51:34 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
Implemented ambiguous mapping checking for Id
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 13:51:34 UTC (rev 5772)
@@ -11,6 +11,9 @@
{
private readonly HbmClass classMapping;
private readonly IIdMapper idMapper;
+ private bool simpleIdPropertyWasUsed;
+ private bool composedIdWasUsed;
+ private bool componentAsIdWasUsed;
private Dictionary<string, IJoinMapper> joinMappers;
private ICacheMapper cacheMapper;
private IDiscriminatorMapper discriminatorMapper;
@@ -64,16 +67,40 @@
public void Id(MemberInfo idProperty, Action<IIdMapper> mapper)
{
- var id = (HbmId) classMapping.Item;
+ var id = classMapping.Item as HbmId;
+ if(id == null)
+ {
+ var propertyDescription = idProperty != null ? " '" + idProperty.Name + "'" : ", with generator, ";
+ throw new MappingException(string.Format("Abiguous mapping of {0} id. A ComponentAsId or a ComposedId was used and you are trying to map the property{1} as id.",
+ Container.FullName, propertyDescription));
+ }
mapper(new IdMapper(idProperty, id));
+ if(idProperty != null)
+ {
+ simpleIdPropertyWasUsed = true;
+ }
}
public void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> mapper)
{
+ if (idProperty == null)
+ {
+ return;
+ }
if (!IsMemberSupportedByMappedContainer(idProperty))
{
throw new ArgumentOutOfRangeException("idProperty", "Can't use, as component id property, a property of another graph");
}
+ if (composedIdWasUsed)
+ {
+ throw new MappingException(string.Format("Abiguous mapping of {0} id. A composed id was defined and you are trying to map the component {1}, of property '{2}', as id for {0}."
+ , Container.FullName, idProperty.GetPropertyOrFieldType().FullName, idProperty.Name));
+ }
+ if (simpleIdPropertyWasUsed)
+ {
+ throw new MappingException(string.Format("Abiguous mapping of {0} id. An id property, with generator, was defined and you are trying to map the component {1}, of property '{2}', as id for {0}."
+ , Container.FullName, idProperty.GetPropertyOrFieldType().FullName, idProperty.Name));
+ }
var id = classMapping.Item as HbmCompositeId;
if(id == null)
{
@@ -81,10 +108,20 @@
classMapping.Item = id;
}
mapper(new ComponentAsIdMapper(idProperty.GetPropertyOrFieldType(), idProperty, id, mapDoc));
+ componentAsIdWasUsed = true;
}
public void ComposedId(Action<IComposedIdMapper> idPropertiesMapping)
{
+ if(componentAsIdWasUsed)
+ {
+ throw new MappingException(string.Format("Abiguous mapping of {0} id. A Component as id was used and you are trying to map an id composed by various properties of {0}.", Container.FullName));
+ }
+ if (simpleIdPropertyWasUsed)
+ {
+ throw new MappingException(string.Format("Abiguous mapping of {0} id. An id property, with generator, was defined and you are trying to map an id composed by various properties of {0}.", Container.FullName));
+ }
+
var id = classMapping.Item as HbmCompositeId;
if (id == null)
{
@@ -92,6 +129,7 @@
classMapping.Item = id;
}
idPropertiesMapping(new ComposedIdMapper(Container, id, mapDoc));
+ composedIdWasUsed = true;
}
public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping)
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs 2011-04-27 13:51:34 UTC (rev 5772)
@@ -0,0 +1,99 @@
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests
+{
+ public class CheckMixingPoidStrategiesTests
+ {
+ private class PersonId
+ {
+ public string Email { get; set; }
+ }
+
+ private class Person
+ {
+ private PersonId id;
+ public PersonId Id
+ {
+ get { return id; }
+ }
+
+ public int Poid { get; set; }
+ public string Name { get; set; }
+ }
+
+ [Test]
+ public void WhenMixComposedIdWithComponentAsIdThenThrows()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof (Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { }));
+ Executing.This(() =>
+ mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { }))
+ ).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMixComponentAsIdWithComposedIdThenThrows()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { }));
+ Executing.This(() =>
+ mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { }))
+ ).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMixComposedIdWithSimpleIdThenThrows()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { }));
+ Executing.This(() =>
+ mapper.Id(For<Person>.Property(x => x.Poid), pm => { })
+ ).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMixComponentAsIdWithSimpleIdThenThrows()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { }));
+ Executing.This(() =>
+ mapper.Id(For<Person>.Property(x => x.Poid), pm => { })
+ ).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMixSimpleIdWithComposedIdThenThrows()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.Id(For<Person>.Property(x => x.Poid), pm => { });
+ Executing.This(() =>
+ mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { }))
+ ).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMixSimpleIdWithComponentAsIdThenThrows()
+ {
+ var mapdoc = new HbmMapping();
+ var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id));
+
+ mapper.Id(For<Person>.Property(x => x.Poid), pm => { });
+ Executing.This(() =>
+ mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { }))
+ ).Should().Throw<MappingException>();
+ }
+ }
+}
\ 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-27 12:08:50 UTC (rev 5771)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 13:51:34 UTC (rev 5772)
@@ -548,6 +548,7 @@
<Compile Include="MappingByCode\ExpliticMappingTests\VersionTests.cs" />
<Compile Include="MappingByCode\For.cs" />
<Compile Include="MappingByCode\MappersTests\AbstractPropertyContainerMapperTest.cs" />
+ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\CheckMixingPOIDStrategiesTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\ClassMapperWithJoinPropertiesTest.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComponetAsIdTests.cs" />
<Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComposedIdTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|