我正在尝试让fNH映射到自定义类型,但我遇到了困难。
我希望fNH通过接口将其值分配给自定义类型。我还需要nHibernate来保留实体上自定义类型的实例。它将始终在访问属性时实例化,不覆盖实例,只需设置包装值。
当我尝试下面的映射时,它会抛出异常“无法在类'Entities.User中找到属性'值'的getter”
想法?
fNH映射:
Map(x =>((IBypassSecurity<string>)x.SecuredPinNumber).Value,"[PinNumber]");
域名示例:
public class User
{
public SecureField<string> SecuredPinNumber {get;private set;}
}
public class SecureField<T> : IBypassSecurity<T>
{
public T Value { get; set; } // would apply security rules, for 'normal' use
T IBypassSecurity<T>.Value {get;set;} // gets/sets the value directy, no security.
}
// allows nHibernate to assign the value without any security checks
public interface IBypassSecurity<T>
{
T Value {get;set;}
}
答案 0 :(得分:2)
Map()方法是一个表达式构建器,用于将属性名称提取为字符串。所以你的映射告诉NH,你想要在User类中映射属性“Value”,当然不存在。如果要使用自定义类型,请阅读有关此内容的NH参考文档,并在映射中使用CustomType()方法。
您还可以为PinNumber使用受保护的属性,允许直接访问。
public class User
{
protected virtual string PinNumber { get; set; } // mapped for direct access
public string SecuredPinNumber
{
get { /* get value with security checks */ }
set { /* set value with security checks */ }
}
}
关于使用Fluent映射受保护的属性,您可以阅读此post。