カテゴリー別アーカイブ: EF

「実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 第6回 データの同時更新を防ぐための排他制御」が公開されました

データの同時更新を防ぐための排他制御:CodeZine

テキストエディターなどの基本的に1人で使う「スタンドアローン」なアプリケーションとは異なり、業務アプリケーションは大勢が同時に使うことが前提です。

大勢が同時に使う場合、1人で使う場合とは大きく異なる点が1つあります。それは、「同じデータをほぼ同時に編集する」というケースが発生するということです。

同じデータをほぼ同時に編集した場合、何も対策をとっていなければ、わずかな差で後から編集を行った操作が採用されることとなります。しかし、それでは具合が悪い場合もあります。

といった感じで、同時実行制御(排他制御)について、基本的な概念とEFを使った楽観的排他制御の実装方法について解説しています。

 

ぜひご覧ください。

EF:Eager Loadのための型安全なInclude

Entity FrameworkのEntity Data Modelにはナビゲーション プロパティというものがあり、データベース上で外部キー制約がついていた場合、その外部キーに紐づくデータを取得できます。

通常、ナビゲーション プロパティはそのプロパティにアクセスされた際に初めてデータアクセスが発生します。(なお、これをLazy Loadといいます。)

 

しかし、必ずナビゲーション プロパティにアクセスすることが分かっている場合、一緒に読み込みを済ませておきたいケースもあります。(なお、これをEager Loadといいます。)

そんなときに使用するのが、Includeメソッドです。

Include メソッド

クエリの結果に含める関連オブジェクトを指定します。

しかし、Includeメソッドの引数は文字列で、タイプミスなどをすぐには検出できません。よく訓練されたC#erとしては、型安全に指定したいですよね?

 

というわけで、拡張メソッドとして作ってみました。

public static ObjectQuery<T> Include<T, V>(
  this ObjectQuery<T> query,
  Expression<Func<T, V>> expression)
{
  var memberExp = expression.Body as MemberExpression;
  if (memberExp == null)
  {
    throw new ArgumentException();
  }

  var entityName = memberExp.Member.Name;
  return query.Include(entityName);
}

 

使い方はシンプルで、次のようにラムダ式で指定します。

var context = new DatabaseEntities();
var persons = context.Persons.Include(x => x.Department);

 

本来は、引数に本当にナビゲーション プロパティを指定されているかどうかをチェックしたりも必要だと思いますが、とりあえずプロトタイプということで。

 

#Expressionからプロパティ名を取得する方法は、こちらの記事を参考にさせていただきました。

INotifyPropertyChanged の実装 « ++C++; // 未確認飛行 C ブログ

EF:連関エンティティはedmではアソシエーションとして表される

#元ネタはこちら→Entity Framework and ASP.NET – Getting Started Part 1: The Official Microsoft ASP.NET Site

 

例えば、以下のようなPersonとProjectの多対多の関係を表すために、PersonProjectという連関エンティティがあるとします。

image

 

この情報を元にEDMを生成すると、PersonProjectはアソシエーションとして定義されます。

image

image

image

image

image

 

EFってうまくできているんだなぁと思ったのでメモ。