У меня есть следующие два класса, где пользователь устанавливает предпочтения. Пользователь может не иметь никаких предпочтений, только лайков, только антипатий или того и другого. В этом примере я уменьшил модель User для простоты.
[BsonIgnoreExtraElements]
public class User : Base
{
public string FirstName { get; set; }
public string LastName { get; set; }
[BsonIgnoreIfNull]
public UserPreferences Preferences { get; set; }
}
[BsonIgnoreExtraElements]
public class UserPreferences
{
[BsonIgnoreIfNull]
public List<string> Likes { get; set; }
[BsonIgnoreIfNull]
public List<string> Dislikes { get; set; }
}
У меня есть вспомогательная функция, которая использует отражение для создания UpdateBuilder. Когда предоставляется объект пользователя, он устанавливает значение для ненулевых полей, поскольку я не хочу специально записывать, какие поля были обновлены при вызове. Однако вспомогательная функция не работает в моей текущей ситуации.
public override User Update(User model)
{
var builder = Builders<User>.Update.Set(x => x.Id, model.Id);
foreach(PropertyInfo prop in model.GetType().GetProperties())
{
var value = model.GetType().GetProperty(prop.Name).GetValue(model, null);
if ((prop.Name != "Id") & (value != null))
{
builder = builder.Set(prop.Name, value);
}
}
var filter = Builders<User>.Filter;
var filter_def = filter.Eq(x => x.Id, model.Id);
Connection.Update(filter_def, builder);
return model;
}
Проблема: При указании Preferences
только Likes
или только Dislikes
, другое свойство будет иметь значение null в MongoDB.
Желаемый результат: Я хочу, чтобы MongoDB игнорировал либо свойство Likes
, либо Dislikes
, если список пуст, как и для других свойств в моем коде.