2014年6月10日火曜日

Entity Framework 5におけるデータバインド。

オフィス狛 技術部です。

Entity Framework 4.xを利用しているシステムをリニューアルする事になり、
.NET Frameworkのバージョンを上げ、Entity Framework も 5 にバージョンアップさせました。

その状態で実行すると、

Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery) is not supported Entity Framework 5

というエラーメッセージが表示されました。
日本語環境だと、

ストア クエリ (DbSet、DbQuery、DbSqlQuery) への直接のデータ バインドはサポートされていません。代わりに、DbSet で Load を呼び出すなどして DbSet にデータを設定し、ローカル データにバインドしてください。WPF の場合は DbSet.Local に、WinForms の場合は DbSet.Local.ToBindingList() にバインドします

と表示されました。

元々のプログラムは単純で、
テーブルから取得したデータをドッロプダウンリストにバインドしているだけです。
using (var context = new DeomDbEntities())
{
  var testObject =
      from master in context.code_name
      where master.code_type == '1' &&
            master.delete_flg == '0'
      orderby master.display_order
      select new { code_value = master.code_value, code_text = master.code_text };

  if (testObject != null)
  {
      dropDownList.DataSource = testObject;
      dropDownList.DataValueField = "code_value";
      dropDownList.DataTextField = "code_text";
      dropDownList.DataBind();
  }
}
日本語のエラーメッセージが分かり難かったのですが、
要は「クエリを直接データソースに設定するな」という事だとだと思い、

dropDownList.DataSource = testObject;

上記部分を

dropDownList.DataSource = testObject.ToList();

と変更する事で、エラーメッセージが表示されなくなりました。
ヒントとなる情報は国内サイトでは見つかりませんでしたが、
Stack Overflowで発見しました。
(プログラムでハマってしまった時に検索すると、大抵「Stack Overflow」に行き着きますよね・・・)
修正後のプログラムは以下に記載しておきます。
using (var context = new DeomDbEntities())
{
  var testObject =
      from master in context.code_name
      where master.code_type == '1' &&
            master.delete_flg == '0'
      orderby master.display_order
      select new { code_value = master.code_value, code_text = master.code_text };

  if (testObject != null)
  {
      dropDownList.DataSource = testObject.ToList();
      dropDownList.DataValueField = "code_value";
      dropDownList.DataTextField = "code_text";
      dropDownList.DataBind();
  }
}
余談ですが、Entity Frameworkのバージョンに関する情報は下記サイトが参考になりました。
Entity Framework の歴史を振り返る

,

0 件のコメント:

コメントを投稿