I've converted our XML mapping to NH 3.3.1 By Code mapping and ran into 2
restrictions which seem to be unwarranted, since they do not exist in the
XML mapping. Both result from reflecting on classes with methods on
NHibernate.Mapping.ByCode.TypeExtensions.


   1. In *DecodeMemberAccessExpressionOf<TEntity>(Expression<Func<TEntity,
   object>> expression)* and *DecodeMemberAccessExpressionOf<TEntity,
   TProperty>(Expression<Func<TEntity, TProperty>> expression)*, there are
   calls (line 104 and 157 respectively) which get the PropertyInfo from the
   entity type. This is restricted to public-only due to the default binding
   level of the GetProperty method. XML mapping doesn't have this restriction,
   and properties can be protected or internal. We use this extensively to
   reduce the surface area of our domain model. I changed the call to accept
   non-public members and the NH unit tests still pass.
   2. In *DetermineDictionaryKeyType* and *DetermineDictionaryValueType*,
   the parameter is a Type which is tested for being a generic type via
   IsGenericType. This property only returns true if the reflected type has
   type parameters. We've specialized an IDictionary<K,V> and was able to map
   it in XML, but not in By Code due to the conditional:* if
   (genericDictionary.IsGenericType)*. Given that the
   GetDictionaryInterface method extracts the dictionary interface and
   performs the same test as this condition, why add this condition? I removed
   this conditional in both cases and the NH unit tests still pass.

As noted, I fixed both these issues to get my mapping working, and if they
are confirmed to be problems, I can enter a Jira issue and push a patch on
my fork and send a pull request.

-rory

Reply via email to