Thanks Morten! It worked.
Thought that it was more FNH than a NH issue because it was in the mapping
so that's why I posted it here. Anyhow, thanks again.
/martin


On Sat, Dec 5, 2009 at 11:53 PM, Morten Maxild <mmax...@gmail.com> wrote:

>  This is NH specific, but anyway….please cross post on nhusers
>
>
>
> A solution is to use a formula in the ‘composite-element mapping’ for the
> ‘duplicated’ property
>
>
>
> In FNH lingo (to avoid magic strings) inside component mapping
>
>
>
> c.Map(x => x. RegionName).Formula(ReflectionHelper.GetProperty<Money>(x =>
> x. RegionName).Name);
>
>
>
> =>
>
>
>
> <property name="RegionName" column=” RegionName” formula=" RegionName " />
>
>
>
> Inside parent ‘composite-element’ element
>
>
>
> HTH
>
> Morten
>
>
>   ------------------------------
>
> *From:* Martin Nilsson [mailto:mffmar...@gmail.com]
> *Sent:* Saturday, December 05, 2009 1:32 PM
> *To:* fluent-nhibernate@googlegroups.com
> *Subject:* [fluent-nhib] Mapping a dictionary with components
>
>
>
> Hi,
>
> I have a dictionary field in my Product class that contains prices (Money
> class) per region. In other words, a dictionary containg Value Objects.
>
> I can save the prices with correct region and amount but when I read them
> from the database then I can't get the region name (Money.RegionName) to map
> correctely. The Money.Amount is mapped correctely though. This is my setup.
>
> public class ProductMap : ClassMap<Product>
> {
>   public ProductMap()
>   {
>     Id(x => x.Id);
>     HasMany(x => x.Prices).Access.CamelCaseField().Cascade.All().AsMap(key
> => key.RegionName)
>       .Component(desc => desc.Map(x => x.Amount));
>   }
> }
>
> public sealed class Money : IEquatable<Money>, IComparable,
> IComparable<Money>
> {
>     private readonly string regionName;
>     private readonly decimal amount;
>
>     public Money()
>         : this(0, new RegionInfo(CultureInfo.CurrentCulture.LCID))
>     {
>     }
>     public Money(decimal amount, string regionName) : this(amount, new
> RegionInfo(regionName))
>     {
>     }
>
>     public string RegionName
>     {
>         get { return regionName; }
>     }
>
>     public decimal Amount
>     {
>         get { return amount; }
>     }
> }
>
> Map part in hbm file:
> <map access="field.camelcase" cascade="all" name="Prices" mutable="true">
>   <key>
>     <column name="Product_id" />
>   </key>
>   <index type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral,
> PublicKeyToken=b77a5c561934e089">
>     <column name="RegionName" />
>   </index>
>   <composite-element class="Money, Domain, Version=1.0.0.0,
> Culture=neutral, PublicKeyToken=null">
>     <property access="field.camelcase" name="Amount" type="System.Decimal,
> mscorlib, Version=2.0.0.0, Culture=neutral,
> PublicKeyToken=b77a5c561934e089">
>       <column name="Amount" />
>     </property>
>   </composite-element>
> </map>
>
> If I change to this (adding map of region name in component):
>
> HasMany(x => x.Prices).Access.CamelCaseField().Cascade.All().AsMap(key =>
> key.RegionName)
>   .Component(desc =>
>     {
>         desc.Map(x => x.Amount).Access.CamelCaseField();
>         desc.Map(x => x.RegionName).Access.CamelCaseField();
>     });
>
> Then I get error:
> [MappingException: Repeated column in mapping for collection:
> Product.Prices column: RegionName]
>    NHibernate.Mapping.Collection.CheckColumnDuplication(ISet`1
> distinctColumns, IEnumerable`1 columns) in d:\OSS\NHibernate
> 2.1\nhibernate\src\NHibernate\Mapping\Collection.cs:615
>
> I have searched for dictionary with components examples but only found for
> set.
> For example "7.2. Collections of dependent objects",
> https://www.hibernate.org/hib_docs/nhibernate/html/components.html
>
> Any hints?
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Fluent NHibernate" group.
> To post to this group, send email to fluent-nhibern...@googlegroups.com.
> To unsubscribe from this group, send email to
> fluent-nhibernate+unsubscr...@googlegroups.com<fluent-nhibernate%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/fluent-nhibernate?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Fluent NHibernate" group.
> To post to this group, send email to fluent-nhibern...@googlegroups.com.
> To unsubscribe from this group, send email to
> fluent-nhibernate+unsubscr...@googlegroups.com<fluent-nhibernate%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/fluent-nhibernate?hl=en.
>

--

You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To post to this group, send email to fluent-nhibern...@googlegroups.com.
To unsubscribe from this group, send email to 
fluent-nhibernate+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/fluent-nhibernate?hl=en.


Reply via email to