1

我已经创建了一个扩展方法,该方法接受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#驱动程序属性,但不幸的是,解决方案总是只是简单地使用反射 - 我已经做了没有用。

+0

您是否已解决此问题或找到其他解决办法? –

回答

0

错误说,你不能在你的查询中使用propFromReflection.GetValue(s)。这个lambda表达式用于获取该属性的名称,它不明白propFromReflection.GetValue是什么。

+0

既然如此,如果我不能以这种方式使用反射,那么动态获取/设置此驱动程序的属性的约定是什么? –

+0

我不知道我在跟随你的问题。这不是价值,而是财产的名称。设置操作需要proeprty的名称 –