データ アクセス レイヤーとして EF4 を使用する ASP.Net MVC アプリケーションがあり、OptimisitcConcurrencyExceptions がスローされるはずのときにスローされないという予期しない動作が見られます。
問題を次のコードに単純化しました...
using System.Linq;
using Project.Model;
namespace OptimisticConcurrency
{
class Program
{
static void Main()
{
Contact firstContact = null;
using (var firstEntities = new ProjectEntities())
{
firstContact = (from c in firstEntities.Contacts
where c.LastName == "smith" select c).Single();
}
using (var secondEntities = new ProjectEntities())
{
var secondContact = (from c in secondEntities.Contacts
where c.LastName == "smith" select c).Single();
secondContact.Title = "a";
secondEntities.SaveChanges();
}
firstContact.Title = "b";
using (var thirdEntities = new ProjectEntities())
{
var thirdContact = (from c in thirdEntities.Contacts
where c.LastName == "smith" select c).Single();
thirdContact.Title = firstContact.Title;
//EXPLICITLY SET VERSION HERE
thirdContact.Version = firstContact.Version;
thirdEntities.SaveChanges();
}
}
}
}
これは、MVC アプリで発生することのかなり単純なバージョンですが、同じ問題が発生します。
thirdEntities で SaveChanges を呼び出すと、例外が発生し、何もスローされません。
さらに興味深いことに、SQL プロファイラーをアタッチすると、where 句で Version が使用されていることがわかりますが、使用されているのは firstEntities の値ではなく、firstEntities のバージョン値 (DB 内の現在の値) であり、明示的にすぐに設定されているにもかかわらずです。 SaveChanges が呼び出される前。SaveChanges は、設定された値ではなく、取得された値になるようにバージョンをリセットしています。
EDMX では、バージョンは、StoreGeneratedPattern が Computed に設定されるように設定されています。
ここで何が起こっているのか誰にも分かりますか?