2010-08-23 24 views
4

我正在尋找一個FluentNH(功能NHibernate)公約或配置屬性,忽略那些沒有二傳手所有屬性:如何創建一個功能NHibernate公約忽略不具備制定者

也仍然這些映射:

public class foo{ 
    public virtual int bar {get; private set;} 
} 

而忽略這些:

public class foo{ 
    public virtual int fizz{get;private set;} 
    public virtual int bar{get {return fizz;}} //<------- 
} 
+1

+1有趣的問題。我通常只是創建一個getter方法:'GetBar()',它另外使其用戶更清楚(但這不是解決您的問題的方法)。 – Abel 2010-08-23 11:23:45

+0

@Abel雖然是可以接受的解決方法。 – 2010-08-23 11:27:54

回答

7

您應該使用自定義的映射配置

public class DefaultMappingConfiguration : DefaultAutomappingConfiguration 
{ 
    public override bool ShouldMap(Member member) 
    { 
     return member.CanWrite; 
    } 
} 

用法:

var nhConfiguration = new Configuration().Configure(); 
var mappingConfiguration = new DefaultMappingConfiguration(); 

var.fluentConfiguration = Fluently.Configure(nhConfiguration); 
    .Mappings(m => m.AutoMappings.Add(
     AutoMap.AssemblyOf<MappedType>(mappingConfiguration) 
    )); 

var sessionFactory = this.fluentConfiguration.BuildSessionFactory(); 

然而,私營制定者不會得到映射。你應該讓他們爲保護

+2

這省略了具有'private set;'的道具。 – 2010-08-23 11:38:05

+0

確定已更新我的回答 – mathieu 2010-08-23 11:43:24

+0

+1:簡單,很好,因爲它應該用FluentNH完成(但刪除那個撫摸過的第一行......;)。 PS:請注意,當有一個私人setter(我認爲)時,CanWrite會返回false。 – Abel 2010-08-23 16:02:45

3

使用此:

public class DefaultMappingConfiguration : DefaultAutomappingConfiguration 
{ 
    public override bool ShouldMap(Member member) 
    { 
     if (member.IsProperty && !member.CanWrite) 
     { 
      return false; 
     } 

     return base.ShouldMap(member); 
    } 
} 

應該處理沒有setter和私人二傳手的情況。

+0

我開始使用方法。想接受它,但有點懶得測試它atm。 :) – 2010-09-11 11:47:17

+0

那麼它適用於我和我的生產代碼,但我不使用任何私人setter。我不確定NHibernate是否可以使用私有setter來處理屬性。 – 2010-09-13 19:14:07

0

我知道這是個老問題,但下面的代碼可以很好地解決私人定製問題。

public override bool ShouldMap(Member member) 
{ 
    var prop = member.DeclaringType.GetProperty(member.Name); 
    bool isPropertyToMap = 
     prop != null && 
     prop.GetSetMethod(true) != null && 
     member.IsProperty; 

    return 
     base.ShouldMap(member) && isPropertyToMap; 
}