自定义类型的流畅nHibernate配置

时间:2012-06-24 13:23:27

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我正在尝试让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;}
}

1 个答案:

答案 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