Как обновить универсальный тип с помощью драйвера MongoDB C # в MongoDB 2.7 - PullRequest
0 голосов
/ 03 октября 2018

Следующий код из этого вопроса Как обновить универсальный тип с драйвером MongoDB C # больше не работает, как сделать то же самое в MongoDB 2.7?

void Update(T entity)
{
    collection.Save<T>(entity);
}

1 Ответ

0 голосов
/ 04 октября 2018

В настоящее время Save доступно только в устаревшем драйвере MongoDB C #.Вы можете найти неразрешенный тикет с обсуждением драйвера JIRA .

В C # все еще возможно реализовать нечто подобное.Поведение задокументировано здесь :

Если документ не содержит поля _id, тогда метод save () вызывает метод insert ().Во время операции оболочка mongo создаст ObjectId и присвоит его полю _id.

и

Если документ содержит поле _id, тогда сохраните () метод эквивалентен обновлению с опцией upsert, установленной в true, и предикатом запроса в поле _id.

Таким образом, вы можете ввести интерфейс маркера в C # для представления поля _id:

public interface IIdentity
{
    ObjectId Id { get; set; }
}

и затем вы можете реализовать Save следующим образом:

public void Update<T>(T entity) where T : IIdentity
{
    if(entity.Id == ObjectId.Empty)
    {
        collection.InsertOne(entity); // driver creates _id under the hood
    }
    else
    {
        collection.ReplaceOne(x => x.Id == entity.Id, entity, new UpdateOptions() { IsUpsert = true } );
    }
}

или проще:

public void Update<T>(T entity) where T : IIdentity
{
    if(entity.Id == ObjectId.Empty)
    {
        entity.Id = ObjectId.GenerateNewId();
    }
    collection.ReplaceOne(x => x.Id == entity.Id, entity, new UpdateOptions() { IsUpsert = true } );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...