Entity Framework と MyDataBinding

LINQでは基本的に、厳密に型指定されたオブジェクトを使用します。これのいいところと悪いところがあります。

いいところは、タイプインの途中でインテリセンスがコーディングをサポートしてくれますので、ケアレスミスを防いでくれます。パフォーマンスも多少いいかも知れません。

ところがDBから抽出したデータをコントロールに表示したり、逆にコントロールのデータをDBに保存するときのコードが多少煩わしくなります。
この原因を作っているのは、私が[Data Binding]を嫌っているからです。.NETの[Data Binding]を信頼して使うのであればすべてがハッピーです。

私が[Data Binding]を嫌っているのは、(私が)この動きを十分にコントロールできないからです。私の予想を超えた動きをするので、「使えない」と(もしかして)勝手に思っているのです。また、[Data Binding]でFormatおよびParseを細かくプログラミングできない(と思っている)のも(しかも決定的)一因です。

[Data Binding]を使わないでデータをコントロールに表示するには、次のようにEntity(オブジェクト)のプロパティを一つずつコントロールのTextプロパティにアサインすることになります。

(いま、contextはEDMのインスタンス、BooksはこのEDMに含まれるEntitySet名、Title、AuthorおよびPriceはBook Tableの列名(=Entityのプロパティ名)とします。
また、画面にTextBox、txt書籍名、txt著者名およびtxt価格が配置されているとします。)

    Dim query = (From book In context.Books).First
    txt書籍名.Text = query.Title
    txt著者名.Text = query.Author
    txt価格.Text = query.Price

一般には画面には沢山のコントロールが配置されていますので、上のコードは書きたくありません。

ところでADO.NETでは次のように列名を文字列で書くことができます(いま検索した[DataRow]をdrとします)。

    txt書籍名.Text = dr("Title")
    txt著者名.Text = dr("Author")
    txt価格.Text = dr("Price")

したがって、コントロール[txt書籍名]と列名”Title”等のマップをあらかじめ作成しておけば、このマッピングを使ってコントロールのプロパティにアサインする仕組みを考えることができます。
例えば、このマッピングは9月18日、23日ブログで紹介しました[CtrlBindingCollection]を使います。

[CtrlBindingCollection]のメソッド[Display]を次のように定義します。
(正確ではありません。概念的な説明と理解してください。また以下で、[P_lst]、[P_Control]、[P_列名]はそれぞれ[m_lst]、[m_Control]、[m_列名]に対応したプロパティです。)

  Sub Display(ByVal dr As DataRow)
    For each c As Cell In P_lst
        c.P_Control.Text = dr(c.P_列名)
    End For
  End Sub

そうすれば、

    Dim CBC As New CtrlBindingCollection
    With CBC
     .Bind(txt書籍名, “Title”, “String”, True)
    .Bind(txt著者名, “Author”, “String”, True)
    .Bind(txt価格, “Price”, “Integer”, True)
    End With

(ここで、Bindメソッドの第一引数はコントロール、第二引数はそのコントロールに対応したDBテーブルの列名、第三引数はそのデータ型–説明のため”String”等の文字列で書いていますが、実際には独自に定義したデータ型のEnum値です–、第四引数はエンターキーで次のコントロールに移動するかどうかのフラグです)

を実行しておけば、

CBC.Display(dr)

でコントロールにデータを表示することができます(予めdrは読み込まれたDataRowだとします)。
逆にDB保存用のメソッドを作成することで、データのDBへの書き出しを一つのメソッドのコールで完了することができます。
この[CtrlBindingCollection]を十分練って汎用的にしておけば、このコレクションに登録したコントロールを一斉に操作することができます。

では、厳密に型指定されたオブジェクトを基本としているLINQではどうする。

先の例で、[txt書籍名]と [query.Title]とのマップを作ってみても何の役にも立ちません([txt書籍名]と dr(“Title”)
のマップを作っても役に立たないのと同じです)。
なぜなら、[query.Title]はインスタンスのプロパティですので(評価されて例えば”坂之上の雲”であり)、これと[txt書籍名]とのマップを保存してみても意味がないのです。

結論からいえば、解決策は[Programming Entity Framework]の17章に書かれています。

error: コピーできません !!