2011-11-05 78 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)); 
}