Nếu bạn đang thực hiện việc này trong async
thì câu trả lời của Brduca sẽ hoạt động (và thích hợp hơn), nếu không bạn có thể gọi Wait()
trên Task
được trả về từ InsertOneAsync
gọi để đảm bảo ứng dụng của bạn tồn tại đủ lâu để thấy ngoại lệ khóa trùng lặp:
commandsCollection.InsertOneAsync(doc).Wait();
Nếu việc chèn không thành công do có một khóa trùng lặp, thì Wait()
sẽ ném ra một AggregateException
có chứa MongoWriteException
chứa các chi tiết chính trùng lặp.
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;
});
}
Tương tự, nếu bạn đang sử dụng await
, điều đó sẽ tạo ra một AggregateException
nữa.
Để tránh sự phức tạp thêm của AggregateException
gói ngoại lệ mongo, bạn có thể gọi GetAwaiter().GetResult()
thay vì 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
}
}