我已經創建了一個擴展方法,該方法接受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#驅動程序屬性,但不幸的是,解決方案總是隻是簡單地使用反射 - 我已經做了沒有用。
您是否已解決此問題或找到其他解決辦法? –