以前の記事で、「XPO Best Practices」の記事を紹介したのですが
- DevExpress奮闘記-028 (XPO Best Practices, Mapping to an Existing Database with XPO)
今日みると、「XPO Worst Practices」というKBが出てました。
今度は、やってはいけないパターン集です。
- XPO Worst Practices
- Why are objects not deleted when I delete them in the XtraGrid?
文字通り、XPOを扱う上でやらない方がいいパターン集です。
今回も、拙い訳ですが各項目を以下に記述。
以下に書いてあるのは**やってはいけないパターン**です。
[Worst Practices]
- XPCollectionで、関連コレクション (Association)を利用するときにDeleteObjectOnRemoveをTrueに設定している。
- Persistent Classを定義する際に、XPO用のプロパティを定義せずにpublicなフィールド定義で済ましている。
- コネクションオブジェクトを取得する際に、Session.Connection、Session.ConnectionStringを利用している。
- パラメータ無しのコンストラクタを定義している。(つまりデフォルトコンストラクタ)
- 計算して算出された値までPersistentしている。
- Criteriaの式で、文字列の結合に”+”を使っている。
で、上記の**やってはいけないパターン**に対する正解は
- Session.Deleteを使って削除する。
- XPO用のプロパティを定義する。(SetPropertyValue, GetPropertyValue)
- Session.DataLayer.Connection, Session.DataLayer.ConnectionStringを利用する。
- パラメータ無しのコンストラクタを定義しない。(Sessionを受け付けるコンストラクタを定義する。)
- PersistentAlias属性を使う。
- concat関数を利用する。(concat(StringA, StringB))
個人的に一番よくやるのは、1)のパターンですね。(「Why are objects not deleted when I delete them in the XtraGrid?」と同じ現象)
削除できないときは、結構焦ります。w
XPO用のプロパティを定義せずに、フィールドで済ましてしまうのはXPOのドキュメントがこのパターンで
チュートリアルのサンプルを記述しているからと言えなくもない気が・・・。
(一応ドキュメントで、「これはサンプルだからこうしてるけど、ほんまはあかんで」みたいな書き方してありますが。)
ちなみに、XPOのドキュメントとかではプロパティ定義の部分で
private string _name; public string Name { get { return _name; } set { SetPropertyValue<string>("Name", ref _name, value); } }
のような書き方がよくしてありますが、_nameのフィールドも定義したくない場合は
public string Name { get { return GetPropertyValue<string>("Name"); } set { SetPropertyValue<string>("Name", value); } }
でもオッケイです。
詳細は、元記事をご覧ください。
とりあえず、今はDirectにSQLを発行できるXPOを待っています・・・。
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ