2017-06-19 3 views
0

Ich erstelle eine Anwendung, die NHibernate-Mapping nach Code verwendet, und kann keine geschützten Eigenschaften zuordnen, wenn ich eine Komponentenzuordnung verwende (entspricht hbm Composite-Element) Mapping) für eine Sammlung von Wertobjekten.NHibernate: Zuordnen von geschützten Elementen in der Zuordnung von Komponenten (Verbundelementen)

Ich bin in der Lage, geschützte Eigenschaften in Entity und Compoment Mappings für einzelne Wertobjekte abzubilden, es ist nur geschützte Eigenschaften werden nicht unterstützt beim Mapping Sammlungen von Wertobjekte.

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); 
       }); 
      })); 
     }); 
    } 

Dies liegt daran, IMinimalPlainPropertyContainerMapper<TContainer> unterstützt Eigenschaften geschützt, während IComponentElementMapper<TComponent> nicht.

Gibt es einen Grund dafür? Es erscheint sinnvoll, dass ein Wertobjekt geschützte Eigenschaften haben darf, die nur zu Prüfzwecken dienen und nicht Teil ihrer konzeptionellen Identität sind, und geschützte Eigenschaften werden mit der Komponentenzuordnung für Einzelwertobjekte unterstützt.

Antwort

0

Es sieht wie folgt aus Feature fehlt, sondern als eine Design-Entscheidung, und wird in einer zukünftigen Version von NHibernate festgesetzt:

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

Als Abhilfe kann, bis dieser Version wären die Alternativen zu Machen Sie die Eigenschaften öffentlich oder ordnen Sie das Wertobjekt als Entität mit einer zusammengesetzten ID unter Verwendung einer Eins-zu-viele-Zuordnung zu, da diese geschützte Variablen unterstützen.

Verwandte Themen