Ceci est la méthode Patch
de mon OdataController
Optimiste Gestion de la concurrence - 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);
}
Mon modèle a une propriété:
[Timestamp]
public byte[] RowVersion { get; set; }
le DbUpdateConcurrencyException
semble ne fonctionne pas du tout. J'ai besoin d'implémenter un mécanisme de contrôle de concurrence en utilisant Etag. J'ai vu quelques exemples here .Mais ils n'utilisent pas Delta dans la méthode.
- Comment puis-je vérifier la concurrence en utilisant etags?
- Est-il possible d'implémenter un attribut personnalisé pour le cheacking simultané?
quelque chose comme:
[CustomConcurrencyCheck]
public async Task<IHttpActionResult> Put([FromODataUri] int key, Delta<Product> patch)
{
...
}
Fournir un exemple simple sera très appréciée.
Si vous utilisez un delta, vous n'aurez que les propriétés qui ont été modifiées. ETag ou RowVersion étaient des propriétés mais les avez-vous changées? Bien sûr que non. Ensuite, les deux ne sont pas dans les données delta. Si vous n'avez pas les valeurs précédentes de ETag ou RowVersion, comment les comparerez-vous? –
À ce stade, vous ne verrez qu'une exception DbUpdateConcurrencyException si deux (ou plus) actions Put pour la même clé ont été traitées en même temps. –