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