我创建了一个接受JObject的扩展方法,并为C#MongoDB驱动程序生成更新定义。我们的想法是JObject中的属性和值用于映射和更新数据库中的属性。但是,更新查询始终会抛出异常。
我的扩展方法采用更新定义构建器并执行以下操作:
public static UpdateDefinition<T> SetFromPropsInObject<T>(this UpdateDefinitionBuilder<T> builder, object obj) {
var objType = obj.GetType();
UpdateDefinition<T> returnBuilder = null;
var tType = typeof(T);
if (obj is JObject) {
var jObj = (JObject)obj;
foreach (var property in jObj.Properties()) {
var propFromReflection = TypeDescriptor.GetProperties(tType).Find(property.Name.ToPascalCase(), false);
if (property.Name.ToLower() != "id" &&
propFromReflection != null) {
if (returnBuilder == null) {
returnBuilder = builder.Set((s) => propFromReflection.GetValue(s), (string)property.Value);
} else {
returnBuilder.Set((s) => propFromReflection.GetValue(s), (string)property.Value);
}
}
}
}
return returnBuilder;
}
我处理与数据库交互的存储库类有一个接受对象的方法,并尝试使用对象中的数据更新数据库中的对象。
public async Task<UpdateResult> UpdateUser(string id, object updateWith) {
var filter = Builders<User>.Filter.Eq(s => s.Id, id);
var update = Builders<User>.Update
.SetFromPropsInObject(updateWith);
return await _dbContext.Users.UpdateOneAsync(filter, update);
}
但是,UpdateOneAsync
方法调用会引发以下异常
Unable to determine the serialization information for s =>
value(Namespace.Data.MongoUtilities+<>c__DisplayClass0_0`1[Namespace.Models.User])
.propFromReflection.GetValue(Convert(s)).
我已经阅读过有关Stack Overflow的类似问题,关于如何使用MongoDB C#驱动程序动态设置属性,但不幸的是,解决方案总是只是使用反射 - 我已经做过了果。
答案 0 :(得分:0)
错误说,你不能在查询中使用propFromReflection.GetValue。这个lambda表达式用于获取属性的名称,并且它不了解propFromReflection.GetValue是什么。