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的名稱 –