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