2017-06-19 92 views
0

我正在構建一個應用程序使用NHibernate映射的代碼,並且我無法映射受保護的屬性,當我使用組件映射(相當於hbm複合元素映射)爲值對象的集合。NHibernate:映射在組件(複合元素)映射受保護的成員

我能映射單個值對象的實體和組件映射中的受保護屬性,它僅僅是映射值對象集合時似乎不受支持的受保護屬性。

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

這是因爲IMinimalPlainPropertyContainerMapper<TContainer>支持保護遺產,而IComponentElementMapper<TComponent>沒有。

這是有原因嗎?值對象應該被允許具有僅用於審計目的的保護屬性並且不構成其概念標識的一部分似乎是合理的,並且對於單值對象的組件映射支持保護屬性。

回答

0

它看起來像這樣缺少的功能,而不是一個設計決策,並會在將來的NHibernate的版本:

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

作爲一種變通方法,直到此版本中,替代將是通過使用一對多映射將屬性公開或將值對象映射爲具有複合標識的實體,因爲這些映射支持受保護的變量。