В настоящее время 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 } );
}