Si está haciendo esto dentro de un async método, entonces la respuesta de Brduca funcionará (y es preferible), de lo contrario, puede llamar a Wait()
en la Task devuelto desde InsertOneAsync Llame para asegurarse de que su aplicación permanezca el tiempo suficiente para ver la excepción de clave duplicada:
commandsCollection.InsertOneAsync(doc).Wait();
Si la inserción falla debido a una clave duplicada, Wait() lanzará una AggregateException que contiene una MongoWriteException que contiene los detalles de la clave duplicada.
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;
});
}
Del mismo modo, si está utilizando await , que arrojará una AggregateException también.
Para evitar la complejidad añadida de AggregateException envolviendo la excepción mongo, puede llamar a GetAwaiter().GetResult() en lugar 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
}
}