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
}
}