流畅的NHibernate ShouldMap不会检测我的自定义属性

时间:2012-02-10 14:08:31

标签: fluent-nhibernate properties automapping skip

我已经花了几天时间来了解Fluent NHibernate自动化工作模型。这很好,但我一直在检测我的架构中缺少的新细节。现在我想为我的类添加额外的属性,但不要将它们映射到数据库。一个典型的例子是当我需要具有内部逻辑的额外属性时 所以我阅读了这些示例并扫描了StackOverflow,发现这不是另一个要添加的约定,而是继承DefaultAutomappingConfiguration并覆盖ShouldMap方法。
很好,没问题,一分钟后我有这样的事情:

public class CustomAutomappingConfiguration : DefaultAutomappingConfiguration
{

    public override bool ShouldMap(Member member)
    {
        var explicitSkip = member.PropertyType.GetCustomAttributes(typeof(SkipMap), false).Length > 0;
        if ((member.IsProperty && !member.CanWrite) || explicitSkip)
        {
            return false;
        }
        return base.ShouldMap(member);
    }
}


/// <summary>
/// Don't map this property to database.
/// </summary>
public class SkipMap : Attribute
{
}


public class DemoClass
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual MyBitwiseEnum Status { get; set; }

    public virtual bool IsValid
    {
        get
        {
            return (int)Status > 3;
        }
    }

    [SkipMap]
    public virtual bool IsBad
    {
        get
        {
            return MyBitwiseEnum.HasFlag(MyBitwiseEnum.Bad);
        }
        set
        {
            MyEnum = value ? MyBitwiseEnum | MyBitwiseEnum.Bad : MyBitwiseEnum ^ MyBitwiseEnum.Bad;
        }
    }
}

我知道我的演示课有点愚蠢,但它会说明我的观点 我的想法是,我想手动决定要映射到数据库的属性
readonly属性工作正常,因为ShouldMap方法将查找property.CanWrite。但是,将无法检测到明确设置的自定义属性。为什么会这样!? 在常规方法中,我经常使用相同的方法,并且在那里工作正常。为什么属性不能在这里检测到定义的属性,当它显然可以在约定设置中。有解决方法吗?

2 个答案:

答案 0 :(得分:2)

您是否已将新的自动化预算添加到Automap?

AutoMap.AssemblyOf<>(new CustomAutomappingConfiguration())

更新:您从布尔类而不是属性

获取skip属性
member.PropertyType.GetCustomAttributes(typeof(SkipMap), false)

应该是

member.MemberInfo.GetCustomAttributes(typeof(SkipMap), false)

答案 1 :(得分:0)

为确保自定义属性适用于属性,请尝试将[AttributeUsage(AttributeTargets.Property)]添加到SkipMap类。

另一种可能性是属性名称冲突,其他属性适用于不同的目标。尝试将类重命名为MyVerySpecialSkipMap并重新测试以验证您没有属性冲突。至少,编写一些简单的反射代码来测试应用程序上下文之外的SkipMap属性,以确保找到它。