From: <fab...@us...> - 2011-05-31 15:06:28
|
Revision: 5897 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5897&view=rev Author: fabiomaulo Date: 2011-05-31 15:06:16 +0000 (Tue, 31 May 2011) Log Message: ----------- - Fix NH-2753 - added <key> column mapping by code Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IListIndexMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListIndexMapper.cs trunk/nhibernate/src/NHibernate/Properties/IndexPropertyAccessor.cs trunk/nhibernate/src/NHibernate/Type/ListType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/FixtureUsingList.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -517,6 +517,20 @@ { model.BaseIndex = Convert.ToInt32(listMapping.ListIndex.@base); } + + if (model.IsOneToMany && !model.Key.IsNullable && !model.IsInverse) + { + string entityName = ((OneToMany)model.Element).ReferencedEntityName; + PersistentClass referenced = mappings.GetClass(entityName); + var ib = new IndexBackref(); + ib.Name = '_' + model.OwnerEntityName + "." + listMapping.Name + "IndexBackref"; + ib.IsUpdateable = false; + ib.IsSelectable = false; + ib.CollectionRole = model.Role; + ib.EntityName = model.Owner.EntityName; + ib.Value = model.Index; + referenced.AddProperty(ib); + } } private void BindArraySecondPass(HbmArray arrayMapping, List model, @@ -664,6 +678,21 @@ BindIndexManyToAny(indexManyToAnyMapping, any, model.IsOneToMany); model.Index = any; } + + bool indexIsFormula = model.Index.ColumnIterator.Any(x=> x.IsFormula); + if (model.IsOneToMany && !model.Key.IsNullable && !model.IsInverse && !indexIsFormula) + { + string entityName = ((OneToMany)model.Element).ReferencedEntityName; + PersistentClass referenced = mappings.GetClass(entityName); + var ib = new IndexBackref(); + ib.Name = '_' + model.OwnerEntityName + "." + mapMapping.Name + "IndexBackref"; + ib.IsUpdateable = false; + ib.IsSelectable = false; + ib.CollectionRole = model.Role; + ib.EntityName = model.Owner.EntityName; + ib.Value = model.Index; + referenced.AddProperty(ib); + } } private void BindIndexManyToAny(HbmIndexManyToAny indexManyToAnyMapping, Any any, bool isNullable) Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -1191,12 +1191,12 @@ //there maybe more than one parent, filter by type if (persister.IsSubclassEntityName(entityEntry.EntityName)) { - Object index = GetIndexInParent(property, childEntity, persister, cp, parent); + object index = GetIndexInParent(property, childEntity, persister, cp, parent); if (index == null && mergeMap != null) { - Object unmergedInstance = mergeMap[parent]; - Object unmergedChild = mergeMap[childEntity]; + object unmergedInstance = mergeMap[parent]; + object unmergedChild = mergeMap[childEntity]; if (unmergedInstance != null && unmergedChild != null) { index = GetIndexInParent(property, unmergedChild, persister, cp, unmergedInstance); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IListIndexMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IListIndexMapper.cs 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IListIndexMapper.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -1,3 +1,5 @@ +using System; + namespace NHibernate.Mapping.ByCode { public interface IListIndexMapper @@ -4,5 +6,6 @@ { void Column(string columnName); void Base(int baseIndex); + void Column(Action<IColumnMapper> columnMapper); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListIndexMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListIndexMapper.cs 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListIndexMapper.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -1,10 +1,12 @@ using System; +using System.Linq; using NHibernate.Cfg.MappingSchema; namespace NHibernate.Mapping.ByCode.Impl { public class ListIndexMapper : IListIndexMapper { + private const string DefaultIndexColumnName = "ListIdx"; private readonly HbmListIndex mapping; private readonly System.Type ownerEntityType; @@ -18,9 +20,42 @@ public void Column(string columnName) { - mapping.column1 = columnName; + Column(x => x.Name(columnName)); } + public void Column(Action<IColumnMapper> columnMapper) + { + HbmColumn hbm = mapping.Columns.SingleOrDefault(); + hbm = hbm + ?? + new HbmColumn + { + name = mapping.column1 + }; + columnMapper(new ColumnMapper(hbm, DefaultIndexColumnName)); + if (ColumnTagIsRequired(hbm)) + { + mapping.column = hbm; + ResetColumnPlainValues(); + } + else + { + mapping.column1 = !DefaultIndexColumnName.Equals(hbm.name) ? hbm.name : null; + } + } + + private void ResetColumnPlainValues() + { + mapping.column1 = null; + } + + private bool ColumnTagIsRequired(HbmColumn hbm) + { + return hbm.length != null || hbm.precision != null || hbm.scale != null || hbm.notnull || hbm.unique + || hbm.uniquekey != null || hbm.sqltype != null || hbm.index != null || hbm.@default != null + || hbm.check != null; + } + public void Base(int baseIndex) { if (baseIndex <= 0) Modified: trunk/nhibernate/src/NHibernate/Properties/IndexPropertyAccessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/IndexPropertyAccessor.cs 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate/Properties/IndexPropertyAccessor.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -25,12 +25,12 @@ public IGetter GetGetter(System.Type theClass, string propertyName) { - throw new NotImplementedException(); + return new IndexGetter(this); } public ISetter GetSetter(System.Type theClass, string propertyName) { - throw new NotImplementedException(); + return new IndexSetter(); } public bool CanAccessThroughReflectionOptimizer Modified: trunk/nhibernate/src/NHibernate/Type/ListType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/ListType.cs 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate/Type/ListType.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -79,8 +79,7 @@ int i = list.IndexOf(element); if (i < 0) return null; - else - return list[i]; + return i; } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Domain.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH941 +{ + public class MyClass + { + public virtual int Id { get; set; } + public virtual IList<Related> Relateds { get; set; } + } + + public class Related + { + public virtual int Id { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Fixture.cs 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/Fixture.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -5,17 +5,6 @@ namespace NHibernate.Test.NHSpecificTest.NH941 { - public class MyClass - { - public virtual int Id { get; set; } - public virtual ICollection<Related> Relateds { get; set; } - } - - public class Related - { - public virtual int Id { get; set; } - } - public class Fixture : TestCaseMappingByCode { protected override HbmMapping GetMappings() Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/FixtureUsingList.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/FixtureUsingList.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH941/FixtureUsingList.cs 2011-05-31 15:06:16 UTC (rev 5897) @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH941 +{ + public class FixtureUsingList : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(rc => + { + rc.Id(x => x.Id, map => map.Generator(Generators.HighLow)); + rc.List(x => x.Relateds, map => + { + map.Key(km => km.NotNullable(true)); + map.Cascade(Mapping.ByCode.Cascade.All); + map.Index(idxm=> idxm.Column(colmap=> colmap.NotNullable(true))); + }, rel => rel.OneToMany()); + }); + mapper.Class<Related>(rc => rc.Id(x => x.Id, map => map.Generator(Generators.HighLow))); + HbmMapping mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + return mappings; + } + + [Test] + public void WhenSaveOneThenShouldSaveMany() + { + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + var one = new MyClass(); + one.Relateds = new List<Related> {new Related(), new Related()}; + session.Persist(one); + tx.Commit(); + } + } + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + session.CreateQuery("delete from Related").ExecuteUpdate(); + session.CreateQuery("delete from MyClass").ExecuteUpdate(); + tx.Commit(); + } + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-31 12:12:20 UTC (rev 5896) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-31 15:06:16 UTC (rev 5897) @@ -867,7 +867,9 @@ <Compile Include="NHSpecificTest\NH2733\Model.cs" /> <Compile Include="NHSpecificTest\NH2736\Domain.cs" /> <Compile Include="NHSpecificTest\NH2736\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH941\Domain.cs" /> <Compile Include="NHSpecificTest\NH941\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH941\FixtureUsingList.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |