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
メソッド呼び出しは、MongoDBのC#のドライバを使用して動的にプロパティを設定する方法については、私はスタックオーバーフロー上で同様の問題について読んだ次の例外
Unable to determine the serialization information for s =>
value(Namespace.Data.MongoUtilities+<>c__DisplayClass0_0`1[Namespace.Models.User])
.propFromReflection.GetValue(Convert(s)).
をスローしますが、残念ながら解決策は、単に反射を使用することです - 私はすでに役に立たないです。
この問題を解決したか、別の回避策を見つけましたか? –