エンティティフレームワークがどのように私の下にある変更データを処理するか(トランザクション)
-
26-10-2019 - |
質問
次のコードを持っているとします。
public void SaveOrUpdate(OrderContract orderContract)
{
foreach (var orderContract in orderContract.Tests)
{
Order order=dataAccess.FindOne<Order>(x=>x.OrderId==orderContract.OrderId)
?? new Order();
// Where there are updates, put the stuff in the
// contract over what we already had.
Mapper.Map(orderContract, order);
// if it is new then add it in so it is inserted by EF.
if (orderedTest.OrderedTestId <= 0)
dataAccess.Add(orderedTest);
}
dataAccess.SaveChanges();
}
EFには、私がそれを取得した後に誰かが注文を更新した場合に気にするものは何でも持っていますか( FindOne
電話?
または、データの取得と私の呼び出しの間に行われた変更を喜んで上書きしますか SaveChanges
?
それがそうしない場合、電話がかかります ObjectContext.Connection.BeginTransaction
私を守るのが最善ですか?または、使用する必要があります new TransactionScope()
?
そして、どちらかが私がトランザクションで必要な行をどのように知っているかをどのように知ることができますか。 (行を読んだからといって、ロックしたいという意味ではありません。または、モデルのすべてのテーブルをロックします(Yuck))。
注:SQL Server 2008 R2およびEF 4.1で実行しています
解決
デフォルトでは、はい、変更されたレコードを上書きします。アプリについて心配している場合は、これを読んでください。
http://msdn.microsoft.com/en-us/library/bb738618.aspx
デフォルトでは、エンティティフレームワークは楽観的な並行性モデルを実装します。これは、データが照会されてデータが更新されたときの間に、データソースのデータにロックが保持されないことを意味します。エンティティフレームワークは、並行性を確認せずにデータベースのオブジェクトの変更を保存します。高度な並行性を経験する可能性のあるエンティティの場合、エンティティは、ConcurrencyMode = "sixed"の属性を持つ概念レイヤー内のプロパティを定義することをお勧めします。