私の WCF サービスのビジネス ロジックでは、エンティティを見つける必要があるほとんどの場所で、次の構文を使用します。
public void UpdateUser(Guid userId, String notes)
{
using (ProjEntities entities = new ProjEntities())
{
User currUser = entities.SingleOrDefault(us => us.Id == userId);
if (currUser == null)
throw new Exception("User with ID " + userId + " was not found");
}
}
DbContext
私は最近、 にメソッドがあることを発見しましたFind
。これができるようになったことを理解しています。
public void UpdateUser(Guid userId, String notes)
{
using (ProjEntities entities = new ProjEntities())
{
User currUser = entities.Find(userId);
if (currUser == null)
throw new Exception("User with ID " + userId + " was not found");
}
}
注 : 「userId」プロパティは、テーブルの主キーです。
メソッドエンティティフレームワークを使用Find
すると、エンティティが既にローカルメモリにあるかどうかを最初に確認し、そうであればそこから取得することを読みました。それ以外の場合 - データベースへのトリップが行われます (SingleOrDefault
常にデータベースへのトリップが行われます)。
危険の可能性はありますSingleOrDefault
か?Find
Find
データベースではなくメモリからデータをフェッチする場合、更新されていない古いデータを取得できる可能性はありますか?
メモリ内にユーザーがいて、誰かがデータベース内のユーザーを変更した場合はどうなりますか? データベースから最新の更新されたレプリカを常にフェッチするのではなく、常にこの「メモリ」レプリカを使用すると問題になりませんか?