読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

DevExpress奮闘記-062 (XPO Worst Practices, Why are objects not deleted when I delete them in the XtraGrid?)

C# DevExpress


以前の記事で、「XPO Best Practices」の記事を紹介したのですが


今日みると、「XPO Worst Practices」というKBが出てました。
今度は、やってはいけないパターン集です。

文字通り、XPOを扱う上でやらない方がいいパターン集です。
今回も、拙い訳ですが各項目を以下に記述。


以下に書いてあるのは**やってはいけないパターン**です。
[Worst Practices]

  1. XPCollectionで、関連コレクション (Association)を利用するときにDeleteObjectOnRemoveをTrueに設定している。
  2. Persistent Classを定義する際に、XPO用のプロパティを定義せずにpublicなフィールド定義で済ましている。
  3. コネクションオブジェクトを取得する際に、Session.Connection、Session.ConnectionStringを利用している。
  4. パラメータ無しのコンストラクタを定義している。(つまりデフォルトコンストラクタ
  5. 計算して算出された値までPersistentしている。
  6. Criteriaの式で、文字列の結合に”+”を使っている。


で、上記の**やってはいけないパターン**に対する正解は

  1. Session.Deleteを使って削除する。
  2. XPO用のプロパティを定義する。(SetPropertyValue, GetPropertyValue)
  3. Session.DataLayer.Connection, Session.DataLayer.ConnectionStringを利用する。
  4. パラメータ無しのコンストラクタを定義しない。(Sessionを受け付けるコンストラクタを定義する。)
  5. PersistentAlias属性を使う。
  6. 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を待っています・・・。


================================
過去の記事については、以下のページからご参照下さい。