From 555ba46e60e60a13fe75b2c30460a4db2f6faacd Mon Sep 17 00:00:00 2001 From: Steve Wagner Date: Thu, 22 Oct 2009 14:04:05 +0200 Subject: [PATCH] Possible fix for #330 - Feature: Support for additional attributes in the key-property element of an set (and equal) --- src/FluentNHibernate/FluentNHibernate.csproj | 3 +- .../Mapping/ColumnMappingCollection.cs | 57 +++++++++++++++++++ src/FluentNHibernate/Mapping/OneToManyPart.cs | 34 +++++++++-- 3 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 src/FluentNHibernate/Mapping/ColumnMappingCollection.cs diff --git a/src/FluentNHibernate/FluentNHibernate.csproj b/src/FluentNHibernate/FluentNHibernate.csproj index 747c03e00..54d49e60c 100644 --- a/src/FluentNHibernate/FluentNHibernate.csproj +++ b/src/FluentNHibernate/FluentNHibernate.csproj @@ -365,6 +365,7 @@ + @@ -684,4 +685,4 @@ --> - + \ No newline at end of file diff --git a/src/FluentNHibernate/Mapping/ColumnMappingCollection.cs b/src/FluentNHibernate/Mapping/ColumnMappingCollection.cs new file mode 100644 index 000000000..0017a5025 --- /dev/null +++ b/src/FluentNHibernate/Mapping/ColumnMappingCollection.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using FluentNHibernate.MappingModel; + +namespace FluentNHibernate.Mapping +{ + public class ColumnMappingCollection + { + private readonly IList columnMappings = new List(); + private readonly TParent parent; + + public ColumnMappingCollection(TParent parent) + { + this.parent = parent; + } + + public TParent Add(string name) + { + columnMappings.Add(new ColumnMapping{Name = name}); + return parent; + } + + public TParent Add(ColumnMapping mapping) + { + columnMappings.Add(mapping); + return parent; + } + + public TParent Add(params ColumnMapping[] mappings) + { + foreach (var mapping in mappings) + { + Add(mapping); + } + return parent; + } + + public TParent Add(params string[] names) + { + foreach(var name in names) + { + Add(name); + } + return parent; + } + + public TParent Clear() + { + columnMappings.Clear(); + return parent; + } + + public IList List() + { + return new List(columnMappings).AsReadOnly(); + } + } +} \ No newline at end of file diff --git a/src/FluentNHibernate/Mapping/OneToManyPart.cs b/src/FluentNHibernate/Mapping/OneToManyPart.cs index b964ea597..2367c9495 100644 --- a/src/FluentNHibernate/Mapping/OneToManyPart.cs +++ b/src/FluentNHibernate/Mapping/OneToManyPart.cs @@ -9,7 +9,7 @@ namespace FluentNHibernate.Mapping public class OneToManyPart : ToManyBase, TChild, OneToManyMapping> { private readonly Type entity; - private readonly ColumnNameCollection> columns; + private readonly ColumnMappingCollection> columns; private readonly CollectionCascadeExpression> cascade; private readonly NotFoundExpression> notFound; private IndexManyToManyPart manyToManyIndex; @@ -33,7 +33,7 @@ protected OneToManyPart(Type entity, MemberInfo member, Type collectionType) this.entity = entity; childType = collectionType; - columns = new ColumnNameCollection>(this); + columns = new ColumnMappingCollection>(this); cascade = new CollectionCascadeExpression>(this, value => collectionAttributes.Set(x => x.Cascade, value)); notFound = new NotFoundExpression>(this, value => relationshipAttributes.Set(x => x.NotFound, value)); @@ -59,7 +59,7 @@ public override ICollectionMapping GetCollectionMapping() foreach (var column in columns.List()) { - collection.Key.AddColumn(new ColumnMapping { Name = column }); + collection.Key.AddColumn(column); } // HACK: shouldn't have to do this! @@ -123,14 +123,38 @@ protected override ICollectionRelationshipMapping GetRelationship() return mapping; } + public OneToManyPart KeyColumn(Action configurator) + { + var mapping = new ColumnMapping {Name = entity.Name + "_id"}; + + if(configurator != null) + configurator(mapping); + + KeyColumns.Clear(); + KeyColumns.Add(mapping); + return this; + } + public OneToManyPart KeyColumn(string columnName) { KeyColumns.Clear(); - KeyColumns.Add(columnName); + KeyColumns.Add(new ColumnMapping { Name = columnName }); + return this; + } + + public OneToManyPart KeyColumn(string columnName, Action configurator) + { + var mapping = new ColumnMapping {Name = columnName}; + + if(configurator != null) + configurator(mapping); + + KeyColumns.Clear(); + KeyColumns.Add(mapping); return this; } - public ColumnNameCollection> KeyColumns + public ColumnMappingCollection> KeyColumns { get { return columns; } }