2011-08-13 14 views
3

RavenDBでは、ProductsおよびCategoriesタイプのオブジェクトを保存できます。これらは自動的に別のコレクションに配置されます。これは問題ありません。同じタイプのドキュメントを持つ異なるRavenDBコレクション

しかし、2つの論理的に完全に異なるタイプの製品が同じクラスを使用するとどうなりますか?または2の代わりに、私は一般的な数の異なるタイプの製品を持つことができました。 Ravenにコレクション内で製品ドキュメントを分割し、Productクラスで利用できる文字列プロパティに基づいて伝えることができますか?

ありがとうございます。

EDIT: 実行時に保存されるドキュメントのコレクションを変更する次のStoreListenerを作成して登録しました。これにより、ドキュメントが異なるコレクションに正しく格納され、ドキュメントを論理的にグループ化することができます。

public class DynamicCollectionDefinerStoreListener : IDocumentStoreListener 
{ 
    public bool BeforeStore(string key, object entityInstance, RavenJObject metadata) 
    { 
     var entity = entityInstance as EntityData; 
     if(entity == null) 
      throw new Exception("Cannot handle object of type " + EntityInstance.GetType()); 
     metadata["Raven-Entity-Name"] = RavenJToken.FromObject(entity.TypeId); 
     return true; 
    } 

    public void AfterStore(string key, object entityInstance, RavenJObject metadata) 
    { 

    } 
} 

しかし、オブジェクトを戻すためにはクエリを調整する必要があるようです。 「TYPEIDの新しいカラスコレクションの名前であること(とあまりにもEntityDataオブジェクトに別々のフィールドとして保存されたエンティティタイプの名前で

session => session.Query<EntityData>().Where(e => e.TypeId == typeId) 

:私の私の典型的なクエリは次のように参照するために使用しました)。

私はどのように私のオブジェクトをクエンチングするつもりですか?私は実行時に私のクエリを実行する前に自分のコレクションを定義できる場所を見つけることができません。

未処理のluceneクエリを実行する必要がありますか?または、クエリリスナーを実装することはできますか?

EDIT: 私は、動的に定義されたコレクションを使用してオブジェクトを格納照会および削除の方法を見つけたが、私は、これはそれを行うための正しい方法であるか分からない:

ドキュメントストアのリスナー:

(私は上記で定義されたクラスを使用して)、インデックス名を解決

方法:

private string GetIndexName(string typeId) 
{ 
    return "dynamic/" + typeId; 
} 

ストア/クエリ/削除:コレクション名のランタイムを指定するとき、私はその少し汚れを感じているが、これは/クエリを保存する方法です

// Storing 
session.Store(entity); 

// Query 
var someResults = session.Query<EntityData>(GetIndexName(entity.TypeId)).Where(e => e.EntityId == entity.EntityId) 
var someMoreResults = session.Advanced.LuceneQuery<EntityData>(GetIndexName(entityTypeId)).Where("TypeId:Colors AND Range.Basic.ColorCode:Yellow) 

// Deleting 
var loadedEntity = session.Query<EntityData>(GetIndexName(entity.TypeId)).Where(e => 
e.EntityId == entity.EntityId).SingleOrDefault(); 
if (loadedEntity != null) 
{ 
session.Delete<EntityData>(loadedEntity); 
} 

/削除しますか?または私は自分自身をこのように罠にかけますか?

+0

なぜ異なるタイプの製品を使用しますが、同じクラスタイプを使用するのはなぜですか?彼らはそれほど違って見えません。 –

+0

私の場合、私はEntityという名前のクラスを持つジェネリックフレームワークに取り組んでいます。実行時に、新しいC#クラスを作成したりコードを再コンパイルすることなく、新しいエンティティタイプをコンフィグレーションすることができます。 私はその型を定義するエンティティにプロパティを持っています。新しいクラスを作成してコードを再コンパイルするのではなく、プロパティに基づいてドキュメントを別々のコレクションに分割するようraven DBに伝えることができれば、その質問を一般的な質問にまとめることができます。 –

答えて

3

ステファン、 あなたが使用して、コレクション名を決定するためのロジックを提供することができます。

store.Conventions.FindTypeTagName 

これは、ジェネリック型を使用して、静的に処理されます。 実行時にその決定を行う場合は、DocumentStoreListner

+0

カスタムコレクション名を処理した方法が正しいことを確認できますか?前もって感謝します :) –

関連する問題