我已经创建了一个扩展方法,该方法接受JObject并为C#MongoDB驱动程序生成更新定义。这个想法是,JObject中的属性和值用于映射和更新数据库中的属性。但是,更新查询始终引发异常。如何在MongoDB C#驱动程序中动态设置属性
我的扩展方法需要更新定义生成器并执行以下操作:
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)).
我读过有关堆栈溢出,类似的问题如何设置动态使用MongoDB的C#驱动程序属性,但不幸的是,解决方案总是只是简单地使用反射 - 我已经做了没有用。
您是否已解决此问题或找到其他解决办法? –