エンティティフレームワークがどのように私の下にある変更データを処理するか(トランザクション)

StackOverflow https://stackoverflow.com/questions/8334193

質問

次のコードを持っているとします。

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"の属性を持つ概念レイヤー内のプロパティを定義することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top