2016-05-27 3 views
0

Ниже код создан с помощью инструмента Wep Api Odata v4 scaffolding.Asp.Net Web Api Odata V4 - Проверка параллелизма

PUT Метод

public IHttpActionResult Put([FromODataUri] string key, Delta<Product> patch) 
{ 
    Validate(patch.GetEntity()); 

    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    Product product = db.Products.Find(key); 
    if (product == null) 
    { 
     return NotFound(); 
    } 

    patch.Put(product); 

    try 
    { 
     db.SaveChanges(); 
    } 
    catch (DbUpdateConcurrencyException) 
    { 
     if (!ProductExists(key)) 
     { 
      return NotFound(); 
     } 
     else 
     { 
      throw; 
     } 
    } 

    return Updated(product); 
} 

ЗАПЛАТА Метод:

[AcceptVerbs("PATCH", "MERGE")] 
public IHttpActionResult Patch([FromODataUri] string key, Delta<Product> patch) 
{ 
    Validate(patch.GetEntity()); 

    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    Product product = db.Products.Find(key); 
    if (product == null) 
    { 
     return NotFound(); 
    } 

    patch.Patch(product); 

    try 
    { 
     db.SaveChanges(); 
    } 
    catch (DbUpdateConcurrencyException) 
    { 
     if (!ProductExists(key)) 
     { 
      return NotFound(); 
     } 
     else 
     { 
      throw; 
     } 
    } 

    return Updated(product); 
} 

Rowversion поля в модели

[Timestamp] 
public byte[] RowVersion { get; set; } 

Вопросы:

  1. Мне нужно реализовать проверку параллельности. Как проверить оптимистичный параллелизм в способе Odata (с помощью Etag)?
  2. В приведенном выше коде DbUpdateConcurrencyException никогда не выбрасывается. Любой причина?
  3. Существует атрибут [ConcurrencyCheck], что его использует ? Могу ли я использовать это?

Предоставление образца кода будет высоко оценено !.

ответ

0

Я решаю эту проверку себя полями параллелизма, потому что патч или put не делают. Это мой код, где plato.TimeStamp является собственностью [Timestamp].

public async Task<IHttpActionResult> Put([FromODataUri] int key, Delta<Plato> patch) 
    { 
     Validate(patch.GetEntity()); 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     Plato plato = await db.Platos.FindAsync(key); 
     if (plato == null) 
     { 
      return NotFound(); 
     } 
//Here save the current value in the DB 
     string timeStamp = Convert.ToBase64String(plato.TimeStamp); 
     patch.Put(plato); 

     try 
     { 
//Here plato.TimeStamp is update from remote, must be equal to stored value 
      if (timeStamp != Convert.ToBase64String(plato.TimeStamp)) 
      { 
       throw new DbUpdateConcurrencyException(); 
      } 
      await db.SaveChangesAsync(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!PlatoExists(key)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return Updated(plato); 
    }