0

いくつかのケースでは、私は実際的な理由で「バッキングプロパティ」を必要とするプロパティを持っています。

たとえば、Nameプロパティを持つ1つのタイプがあります。アクセス時に発生する値の変換はなく、ある種のアクションをトリガーするだけです。あなたがそうするなら、副作用。(議論のために重要であるというわけではありませんが、この特定のケースでは、名前は変更されたときに別の場所にコピーされます。)

まあ言ってみれば:

public class Person
{
    private string __name;

    protected internal virtual string _name
    {
        get
        {
            return this.__name;
        }
        set
        {
            this.__name = value;
        }
    }

    public virtual string Name
    {
        get
        {
            return _name;
        }

        set
        {
            _name = value;

            // action when changing the name takes place here...
        }
    }
}

したがって、「_ name」プロパティはデータベースにマップされますが、直接変更できないように保護/内部的に保持されます。そして、2番目のパブリックプロパティ「Name」が実際のアクセスを提供します。

私がこのように設定した理由は、そのアクションがマップされた「_name」プロパティのset-methodに直接組み込まれている場合、オブジェクトがデータベースからハイドレイトされたときにトリガーされるためです。これは私が望んでいることではありません。

これはすべて問題なく機能します。

問題は、このタイプをクエリする必要がある場合、そのプロパティがマップされていないため、Person.Nameをクエリしようとしても機能しないことです。

私がこれについて嫌いなのは、Person.Nameに対してコードを記述しているが、Person._nameに対してクエリを記述しなければならないという事実です。これは、エラーが発生しやすく、混乱を招きます。

この問題を解決するためのより良い方法はありますか?

4

1 に答える 1

0

マッピングのアクセスにnosetter.camelcase-underscoreを使えますか?これにより、プロパティ セッターを使用する代わりに、フィールドが直接設定されます (_name などのように正しく名前が付けられている場合)。

例えば:

<property name="Name" column="Name" type="String" access="nosetter.camelcase-underscore"/>
于 2011-12-22T15:40:58.887 に答える