Om du gör detta inom en async
metod, då kommer Brducas svar att fungera (och är att föredra), annars kan du ringa Wait()
på Task
returneras från InsertOneAsync
ring för att säkerställa att din applikation finns kvar tillräckligt länge för att se undantaget för dubblettnyckeln:
commandsCollection.InsertOneAsync(doc).Wait();
Om insättningen misslyckas på grund av en dubblettnyckel visas Wait()
kommer att kasta en AggregateException
som innehåller en MongoWriteException
som innehåller dubblettnyckeldetaljerna.
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;
});
}
På samma sätt, om du använder await
, som kommer att kasta en AggregateException
likaså.
För att undvika den extra komplexiteten hos AggregateException
omsluter mongo-undantaget kan du anropa GetAwaiter().GetResult()
istället för 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
}
}