2017-06-19 5 views
0

Je crée une application qui utilise le mappage NHibernate par code et je ne parviens pas à mapper des propriétés protégées lorsque j'utilise un mappage de composants (équivalent à l'élément composite hbm mapping) pour une collection d'objets de valeur.NHibernate: mappage des membres protégés dans le mappage de composants (élément composite)

Je suis capable de mapper des propriétés protégées dans des mappages d'entités et de composants pour des objets à valeur unique, seules les propriétés protégées ne semblent pas être prises en charge lors du mappage de collections d'objets de valeur.

public class MyEntity 
{ 
    public virtual int Id { get; protected set; } 
    protected virtual MyValueObject MyValueObject { get; set; } 
} 

public class MyValueObject 
{ 
    protected string SomeString { get; set; } 
    protected ISet<NestedValueObject> NestedValueObjects { get; set; } 
    // Constructor, Equals/GetHashcode overrides, etc. 
} 

public class NestedValueObject 
{ 
    public string Name { get; set; } 
    protected DateTime CreatedOn { get; set; } // Audit only property 
    // Constructor, Equals/GetHashcode overrides, etc. 
} 

    public MyEntityMap() 
    {    
     Table("MyEntityTable"); 
     Id(x => x.Id, map => 
     { 
      map.Column("Id"); 
     }); 

     Component<MyValueObject>("MyValueObject", c => 
     { 
      // Protected property maps correctly 
      c.Property("SomeString", map => 
      { 
       map.NotNullable(true); 
      }); 
      c.Set<NestedValueObject>("NestedValueObjects", map => 
      { 
       map.Table("NestedValueObjectsTable"); 
       map.Key(k => k.Column("MyEntityId")); 
      }, r => r.Component(n => 
      { 
       // Public property maps correctly 
       n.Property(x => x.Name); 
       // Compilation fail - there is no method that supports protected properties in component mappings 
       n.Property<DateTime>("CreatedOn", map => 
       { 
        map.NotNullable(true); 
       }); 
      })); 
     }); 
    } 

En effet, les propriétés protégées IMinimalPlainPropertyContainerMapper<TContainer> supports, alors que IComponentElementMapper<TComponent> ne fonctionne pas.

Y a-t-il une raison à cela? Il semble raisonnable qu'un objet valeur soit autorisé à avoir des propriétés protégées à des fins d'audit uniquement et ne faisant pas partie de son identité conceptuelle, et les propriétés protégées sont prises en charge avec le mappage de composants pour les objets à valeur unique.

Répondre

0

On dirait que ce manque caractéristique, plutôt que d'une décision de conception, et sera corrigé dans une prochaine version de NHibernate:

https://nhibernate.jira.com/browse/NH-3993

Pour contourner ce problème jusqu'à ce que cette version, les alternatives seraient à rendre les propriétés publiques ou mapper l'objet valeur en tant qu'entité avec un identifiant composite en utilisant un mappage un-à-plusieurs, car celles-ci prennent en charge les variables protégées.