我已经花了几天时间来了解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。但是,将无法检测到明确设置的自定义属性。为什么会这样!?
在常规方法中,我经常使用相同的方法,并且在那里工作正常。为什么属性不能在这里检测到定义的属性,当它显然可以在约定设置中。有解决方法吗?
答案 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
属性,以确保找到它。