1

fNH をカスタム タイプにマップしようとしていますが、問題があります。

カスタムタイプへのインターフェースを介して、fNHにその値を割り当ててもらいたい。エンティティのカスタム型のインスタンスを保持するために nHibernate も必要です。プロパティにアクセスすると常にインスタンス化されます。インスタンスを上書きせず、ラップされた値を設定するだけです。

以下のマッピングを試すと、「クラス 'Entities.User のプロパティ 'Value' のゲッターが見つかりませんでした」という例外がスローされます

アイデア?

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;}
}
4

1 に答える 1

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 を使用した保護されたプロパティのマッピングに関するこの投稿を読むことができます。

于 2012-06-24T16:19:06.357 に答える