рассмотрим следующий классКак избежать ошибки «Дублировать Имя элемента» при построении UpdateBuilder
public class Something
{
public ObjectId Id;
public DateTime DbUpdatedAt;
public string AnotherProperty;
public int SomeIntProp;
}
я обычно делаю частичное обновление с помощью следующего кода
var obj = ... // an instance of Something
var update = new UpdateBuilder<Something>();
update.Set(x => x.DbUpdatedAt, DateTime.UtcNow);
...
/// later on,
// database is an instance of MongoDatabase
database.GetCollection("CollectionName")
.Update(Query<Something>.Eq(x => x.Id, something.Id), update);
Проблема в том, я я не знаю ни одного способа проверить, было ли уже установлено update
для установки значения для DbUpdatedAt
. Если я вслепую попытаюсь установить новое значение для DbUpdatedAt
, я получаю сообщение об ошибке.
...
/// later on,
update.Set(x => x.DbUpdatedAt, DateTime.UtcNow.AddHours(1)); // this throws a Duplicate element name error
// database is an instance of MongoDatabase
database.GetCollection("CollectionName")
.Update(Query<Something>.Eq(x => x.Id, something.Id), update);
Я понимаю, ПОЧЕМУ произошла ошибка. Мне нужен способ,
- Detect есть дубликат ключа сценария,
- Заменить старый ключ, пару значений с новым ключом, значение пары.
Спасибо. Это сработало хорошо.Для этого во всех случаях мне всегда придется использовать SetWithOverride (поскольку я не уверен, что другая функция уже вызвала set или нет). Имея это в виду, имеет ли эта функция какие-либо проблемы с производительностью? Код преобразует два оператора обновления в документы bson, а затем обратно в инструкцию обновления. Все ли десериализация/сериализация влияет на многие вызовы? –
Кроме того, я создал проблему JIRA (https://jira.mongodb.org/browse/CSHARP-902). Надеюсь, он скоро будет реализован :) –