2017-09-19 6 views
1

저는 C#에서 EF를 사용하여 ASP.NET MVC 프로젝트를 작업 중이며이 부분은 다른 세션에서 엔티티를 동시에 업데이트하지 않도록하기위한 것입니다. 이 책은 훌륭하지만 유감스럽게도이 부분에서는 설명이 충분하지 않으며 누군가가 나를 이해하도록 도와 주시면 감사하겠습니다. 관련성없는 코드를 생략하려고합니다. TryUpdateModel 방법은 성공적으로 모델을 업데이트하고, 새로운 가치의 "이름"바인딩 경우 :DbEntityEntry OriginalValues ​​vs. TryUpdateModel 동시 업데이트를 피하기위한 RowVersion (낙관적 인)

여기
[HttpPost] 
public ActionResult Edit(int? id, byte[] rowVersion) 
{ 
    string[] fieldsToBind = new string[] { "Name", "RowVersion" }; 
    var categoryToUpdate = db.Categories.Find(id); 
    if (TryUpdateModel(categoryToUpdate, fieldsToBind)) 
     { 
      try 
      { 
       db.Entry(categoryToUpdate).OriginalValues["RowVersion"] = 
        rowVersion; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      catch (DbUpdateConcurrencyException ex) 
      {//... and the code goes on to handle the concurrent update 
      // scenario 
      } 

내가 이해하지 못하는 것입니다 :이 모델은 기본적으로는 정말 간단하므로 단 하나의 속성 "이름"가 및 "RowVersion"(뷰에서 제공 한)이 줄을 포함시켜야하는 이유는 무엇입니까? db.Entry (categoryToUpdate) .OriginalValues ​​[ "RowVersion"] = rowVersion; 이 라인은 정확히 무엇을합니까? 예외가 발생하는 데 필요한 이유는 무엇입니까? 감사합니다.

답변

0

이것은 EF가 내부적으로 작동하는 방식과 관련이 있습니다. 이 명령.에 대한 UPDATE 명령을 생성 할 때 EF는 OriginalValues에 RowVersion 값이있는 행을 찾습니다. 당신은을 변경하지 않는 한 엔티티의 최신 값이 줄을 DB에서로드되어 있기 때문에 db.Categories.Find(id);

은 동시성 예외가 없을 것입니다 :

그 라인은 기업이 줄을 DB에서로드되어 있기 때문에 추가해야합니다 RowValue 값은 OriginalValues에 저장됩니다. 엔티티가 DB에서로드되지 않았습니다 및 업데이트는 다음 OriginalValues에 RowVersion을 설정할 필요가 없을 것 컨텍스트에 부착에 의해 수행 된 경우

.