Si vous faites cela dans un async
méthode, alors la réponse de Brduca fonctionnera (et est préférable), sinon vous pouvez appeler Wait()
sur la Task
renvoyé par InsertOneAsync
appelez pour vous assurer que votre application reste suffisamment longtemps pour voir l'exception de clé en double :
commandsCollection.InsertOneAsync(doc).Wait();
Si l'insertion échoue à cause d'une clé en double, le Wait()
lancera une AggregateException
qui contient une MongoWriteException
qui contient les détails de la clé en double.
try
{
commandsCollection.InsertOneAsync(doc).Wait();
}
catch(AggregateException aggEx)
{
aggEx.Handle(x =>
{
var mwx = x as MongoWriteException;
if (mwx != null && mwx.WriteError.Category == ServerErrorCategory.DuplicateKey)
{
// mwx.WriteError.Message contains the duplicate key error message
return true;
}
return false;
});
}
De même, si vous utilisez await
, qui lancera une AggregateException
aussi.
Pour éviter la complexité supplémentaire de l'AggregateException
enveloppant l'exception mongo, vous pouvez appeler GetAwaiter().GetResult()
au lieu de Wait()
:
try
{
commandsCollection.InsertOneAsync(doc).GetAwaiter().GetResult();
}
catch(MongoWriteException mwx)
{
if (mwx.WriteError.Category == ServerErrorCategory.DuplicateKey)
{
// mwx.WriteError.Message contains the duplicate key error message
}
}