4

リフレクションを通じて型を動的にロードし、クラスをインスタンス化し、データを入力してから RavenDB に保存します。それらはすべて interface を実装しますIEntity

RavenDB UI では、クラスが正しく表示され、メタ データに正しい CLR タイプが含まれていることがわかります。

ここで、データを元に戻し、変更してから保存したいと考えています。

やりたいこと

System.TypeRavenDB の CLR メタ データのエンティティと一致するを持ってmyTypeいます。

session.Query(myType).ToList(); // session is IDocumentSession

しかし、RavenDB のクエリは次のようになるため、それはできません。

session.Query<T>();

コンパイル時にジェネリック型 T がありません。動的にロードしています。

解決策 1 - ビッグ ドキュメント

私が (概念実証のために) 試みた最初の方法は、すべてのエンティティを 1 つのデータ オブジェクトにラップして保存することでした。

public class Data {
    List<IEntity> Entities = new List<IEntity>();
}

セッションが適切に開閉され、ID があると仮定します。

var myDataObject = session.Load<Data>(Id);

myDataObject.Entities.First(); // or whatever query 

私の型はすべて動的であり、動的に読み込まれる DLL で指定されているため、オブジェクトの作成を実行するには、カスタム json デシリアライザーが必要です。ここの回答でそれを指定します。

ドキュメント全体を本番環境にロードするのは効率的ではないため、これは行いません。

## 考えられる解決策 2 ##

Lucene を使用して型のメタデータをクエリし、データをdynamic型として取得できることを理解しています。その後、恐ろしいキャストを行い、変更を加えることができます。


@Tung-Chauの後に更新

残念ながら、どちらのソリューションも機能しません。理由を説明しましょう:

私はエンティティを次のように保存しています:

session.Store(myDataObject);

データベースでは、 という名前のドキュメントが生成されますmyDataObject.GetType().Name。もしあなたがそうするなら:

var myDataObject = session.Load<IEntity>(Id);

次に、名前で保存されていないため、ドキュメントが見つかりませんIEntity。動的タイプの名前で保存されます。

現在、Lucene ソリューションも機能しませんが、もう少し複雑な理由があります。Lucene が型を見つけると (それが検出されます)、Raven はそれを前述のカスタム JsonDeserialiser に渡します。カスタム Json Deserialiser はメタ データにアクセスできないため、反映する型がわかりません。

コンパイル時ではなく型がわかっている場合にデータを取得するより良い方法はありますか?

ありがとうございました。

4

1 に答える 1