Jeśli robisz to w ramach async metoda, wtedy odpowiedź Brduca zadziała (i jest preferowana), w przeciwnym razie możesz zadzwonić Wait()
w Task zwrócone z InsertOneAsync wywołaj, aby upewnić się, że aplikacja działa wystarczająco długo, aby zobaczyć wyjątek zduplikowanego klucza:
commandsCollection.InsertOneAsync(doc).Wait();
Jeśli wstawienie nie powiedzie się z powodu zduplikowanego klucza, Wait() zrzuci AggregateException który zawiera MongoWriteException który zawiera zduplikowane szczegóły klucza.
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;
});
}
Podobnie, jeśli używasz await , który zwróci AggregateException również.
Aby uniknąć dodatkowej złożoności AggregateException zawijając wyjątek mongo, możesz wywołać GetAwaiter().GetResult() zamiast 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
}
}