2011-11-05 77 views
0

我想用映射機制,根據財產的屬性標記,像這樣:如何根據屬性爲FluentNHibernate創建AutoMap功能?

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = true)] 
public class DomainSignatureAttribute : Attribute { } 

public class SomeThing { 
    [DomainSignature] 
    public virtual string SomePropertyForMapping {get;set;} 
    [DomainSignature] 
    public virtual int OtherPropertyForMapping {get;set;} 

    public virtual string OtherPropertyWithoutMapping {get;} 
} 
在類映射兒童

所以我想實現這個方法,映射所有屬性,通過DomainSignatureAttribute屬性標記:

protected void MapPropertiesWithStandartType() 
{ 
    foreach (PropertyInfo property in typeof(T).GetProperties()) 
    { 
     if (property != null) 
     { 
      object[] domainAttrs = property.GetCustomAttributes(typeof (DomainSignatureAttribute), true); 

      if (domainAttrs.Length > 0) 
       Map(x => property.GetValue(x, null)); 
     } 
    } 
} 

但Linq存在一個小問題。當FluentNHibernate構建映射(Cfg.BuildSessionFactory())時,它與

嘗試在添加屬性'GetValue'時添加屬性。

異常。由於我不想要,我需要重建Linq表達式:x => property.GetValue(x, null)爲正確的形式。

請不要建議使用AutoMap功能,也不要建議使用手動映射。

+0

您可以使用自動映射+自動映射重寫(IAutoMappingOverride),然後爲不想映射的屬性定義mapping.IgnoreProperty(...)。 – VahidN

回答

1
var domainproperties = typeof(T).GetProperties() 
    .Where(prop => prop.GetCustomAttributes(typeof (DomainSignatureAttribute), true).Length > 0); 

foreach (var property in domainproperties) 
{ 
    Map(Reveal.Member<T>(property.Name)); 
}