Stefan:

Maps (dictionaries) in NHibernate can be:

- a entity as the key and another as the value (many-to-many);
- a primitive value as the key, and a key as the value;
- an entity as the key, and a primitive value as the value (pardon the 
redundancy);
- a component type as the key and a primitive value as the value;
- a component type as the key and an entity as the value;
- a component type as the key and another as the value.

The bugfix fixed what was meant to fix. If it poses other problems, then we 
are here to fix them.
BTW, what isn't mapping by code capable to do?

RP


On Thursday, November 27, 2014 7:25:35 AM UTC, Stefan Steinegger wrote:
>
> Hi all
>
> I don't know where to go with this problem. I'm trying to integrate NH 
> 4.0.2 into our project, which is using NH 3.3.0 today. It fails. I went 
> debugging into the code and found the reason why.
>
> This mapping:
>             Bag(
>                 x => x.AssignedInstruments,
>                 m =>
>                 {
>                     m.Table("SomeTable");
>                     m.Key(k => k.Column("Some_FK"));
>                 },
>                 r => r.ManyToMany(m =>
>                 {
>                     m.Class(typeof(InstrumentEntity));
>                     m.Column("Instrument_FK");
>                 }));
>
> Goes through this code (ModelMapper.cs, Line 1278):
>
>         protected virtual ICollectionElementRelationMapper 
> DetermineCollectionElementRelationType(MemberInfo property, PropertyPath 
> propertyPath, System.Type collectionElementType)
>         {
>             // ...
>
>             //NH-3667 & NH-3102
>             //check if property is really a many-to-many: as detected by 
> modelInspector.IsManyToMany and also the collection type is an entity
>             if (modelInspector.IsManyToMany(property) == true)
>             {
>                 if 
> (property.GetPropertyOrFieldType().IsGenericCollection() == true)
>                 {
>                     var args = 
> property.GetPropertyOrFieldType().GetGenericArguments();
>
>                     if (modelInspector.IsEntity(args.Last()) == true)
>                     {
>                         return new ManyToManyRelationMapper(propertyPath, 
> customizerHolder, this);
>                     }
>                 }
>             }
>
> The problem in our project is that the entity is not known at compile time 
> of the mapping by code definition, because is it mapped using XML (which 
> also cannot be changed because of problems with mapping by code not able to 
> map that, but this is another problem). The XML mappings are not visible to 
> mapping by code, so IsEntity returns false and it turns the many to many 
> relation into a bag of primitive values. In version 3.3, it was always 
> creating a correct many-to-many mapping.
>
> I do not understand this bugfix. Why should it *ever *be correct to make 
> a many-to-many relation a collection of primitive values?
>
> Both related bugs are about dictionaries. Could it probably be fixed 
> somewhere else, in dictionary specific code? 
>
> Cheers
> Stefan
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"nhibernate-development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nhibernate-development+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to