2011-08-10 9 views
0

私のデータベースでは、ビューの1つに対するユーザーGUI設定を、セミコロンで区切られた文字列( "1; 31; 5; 411;")として保存します。プライベートメンバーを持つNHibernateエンティティデザイン

私はこのプロジェクトでNNibernateを使用していますが、これはこの特定のプライベートメンバーのマッピングとコードです。

C#のエンティティコードUser.Settingsため

private string _linkConsole = "0"; 

[DataMember] 
public LinkConsole LinkConsole 
{ 
    get { return new LinkConsole(_linkConsole); } 
    set { _linkConsole = value.GetSqlString(); } 
} 

XMLマッピング:

<property name="LinkConsole" type="System.String" access="field.camelcase-underscore" not-null="true"/> 

LinkConsoleの値をトグルされるGUI固有の設定、のパブリックメソッドをたくさん持っています特定の私的メンバーの

この設定をデータベースに保存するときは、.GetSqlString();文字列をフォーマットし、プライベートメンバー_linkConsoleに書き込みます。これは、NHibernate &データベースに公開されているプラ​​イベートメンバーです。

問題:

私はGUIで何かをしよう、すなわち:

User.Settings.LinkConsole.SetRightPaneContent(50); 

これは、オブジェクトLinkConsole上に格納されることはありません、と私は理由を把握することができないよう?私はブレークポイントを設定 とき、私は、Visual Studioのメッセージが述べ得る:

あなたのステップへの要求は、プロパティまたはオペレータの自動ステップオーバーになった

は多分これが結果です私はこれを間違った方法で設計しているのですか? もしそうなら、プライベートストリングメンバーと組み合わせてこれを達成することは可能でしょうか?

ご協力いただければ幸いです!ありがとう! :-)

答えて

1

これは本当にNHibernate問題ではありません。 LinkConsoleは参照型です。そのメンバーを設定した場合は、取得したプロパティのsetメソッドを呼び出さず、元のgetから返されたインスタンスの値を設定します。このコードを機能させたい場合は、Userから新しいLinkConsoleインスタンスを取得し、メソッドを呼び出して設定を行い、次にユーザーのLinkConsoleプロパティを設定済みのインスタンスに設定する必要があります。

+0

甘い! これは全体的に悪い設計/うまくいかないものを設計しようとする試みです。 ありがとうございますtom.dietrich! – CoderBang

0

問題はおそらく、データベースに書き込まれているプラ​​イベート変数をどのように設定しているかにあります。あなたのコードを見ることなく、私は確認することはできませんが、Visual Studioにプロパティにステップできるようにするには、次の資料を見て:

http://msdn.microsoft.com/en-us/library/cc667388.aspx

+0

ありがとうございます。私はw/breakpointをデバッグすることができ、問題がデータベースに書き込まれる前に発生しています。 プライベートメンバーは何らかの理由で更新されることはありません。 このプロセスで2つの異なるLinkConsoleインスタンスが作成されている可能性があります。これは、プライベートメンバーがデータベースに適用された「最終」インスタンスで変更されていないように見える理由です。 それで、なぜ私はそれが私の悪いデザインだと思いますか?しかし、これが実際にうまくいくのであれば、それはとても便利なので、甘いでしょう。どんなデザインの実装も(誰からでも)高く評価されます!ありがとう – CoderBang

2

NHibernateタイプとして使用するために、LinkConsoleのカスタムIUserTypeを実装することを検討しましたか?

あなたが記述しているユースケースは、正確にIUserTypeのものです。

+0

入力いただきありがとうございます!私は今、IUserTypeを調べます。:-) – CoderBang

関連する問題