Dies ist die Patch
Methode meiner OdataController
optimistisch Concurrency Handhabung - Asp.Net WebAPI OData V4
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Product> patch)
{
Validate(patch.GetInstance());
Product product = await service.Products.GetAsync(key);
if (product == null)
return NotFound();
patch.Put(product);
try
{
await service.Products.UpdateAsync(product);
}
catch (DbUpdateConcurrencyException)
{
if (!await service.Products.ExistAsync(key))
return NotFound();
else
throw;
}
return Updated(product);
}
Mein Modell hat eine Eigenschaft:
[Timestamp]
public byte[] RowVersion { get; set; }
die DbUpdateConcurrencyException
überhaupt nicht scheint zu arbeiten. Ich muss Parallelität Prüfmechanismus mit Etag implementieren. Ich habe einige Beispiele gesehen here. Aber sie verwenden nicht Delta in dort Methode.
- Wie kann ich Parallelität mit Etags überprüfen?
- Ist es möglich, ein benutzerdefiniertes Attribut für Concurrency Cheacking zu implementieren?
etwas wie:
[CustomConcurrencyCheck]
public async Task<IHttpActionResult> Put([FromODataUri] int key, Delta<Product> patch)
{
...
}
ein einfaches Beispiel Providing sehr geschätzt wird.
Wenn Sie ein Delta verwenden, erhalten Sie nur die Eigenschaften, die geändert wurden. ETag oder RowVersion waren Eigenschaften, aber hast du sie geändert? Natürlich nicht. Dann sind beide nicht in Delta-Daten. Wenn Sie die vorherigen Werte von ETag oder RowVersion nicht hatten, wie werden Sie sie vergleichen? –
An dem aktuellen Punkt wird nur eine DbUpdateConcurrencyException angezeigt, wenn zwei (oder mehr) Put-Aktionen für den gleichen Schlüssel zur gleichen Zeit verarbeitet wurden. –