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メソッド呼び出しは、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)). 

をスローしますが、残念ながら解決策は、単に反射を使用することです - 私はすでに役に立たないです。

+0

この問題を解決したか、別の回避策を見つけましたか? –

答えて

0

エラーメッセージには、propFromReflection.GetValue(s)を使用することはできません。このラムダ式はプロパティの名前を取得するために使用され、propFromReflection.GetValue(s)の内容を理解しません。

+0

このようにリフレクションを使用できない場合、このドライバでプロパティを動的に取得/設定するための規約は何ですか? –

+0

私はあなたの質問に従っているか分からない。値のためではなく、プロパティの名前です。設定操作には、proeprtyの名前が必要です –

関連する問題