リフレクションを通じて型を動的にロードし、クラスをインスタンス化し、データを入力してから RavenDB に保存します。それらはすべて interface を実装しますIEntity
。
RavenDB UI では、クラスが正しく表示され、メタ データに正しい CLR タイプが含まれていることがわかります。
ここで、データを元に戻し、変更してから保存したいと考えています。
やりたいこと
System.Type
RavenDB の 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 はメタ データにアクセスできないため、反映する型がわかりません。
コンパイル時ではなく型がわかっている場合にデータを取得するより良い方法はありますか?
ありがとうございました。