2011-08-13 63 views
3

在RavenDB中,我可以存储产品和类别类型的对象,它们将自动位于不同的集合中。这可以。不同的RavenDB集合与相同类型的文档

但是如果我有2个逻辑上完全不同类型的产品,但他们使用相同的类呢?或者,而不是2我可以有一个通用数量的不同类型的产品。那么是否有可能告诉Raven将产品文档分为多个集合,让我们根据产品类中提供的字符串属性进行说明?

提前谢谢。

编辑: 我创建并注册了以下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) 
    { 

    } 
} 

但是,似乎我不得不调整我的查询以便能够返回对象。我矿的典型查询使用看起来像这样:

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

随着“TYPEID”是新的乌鸦藏品的名称(和EntityData对象上保存为一个单独的领域过于实体类型的名称)。

我该如何去追求我的对象?在执行我的查询之前,我找不到可以在运行时定义集合的位置。

我是否必须执行一些原始lucene查询?或者我可以实现一个查询侦听器?

编辑: 我发现存储,查询和删除使用动态定义的集合对象的方式,但我不知道这是做正确的方式:

文档存储监听器:

(I使用上面定义的类)

方法解析索引名:

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#类并重新编译任何代码的情况下配置新的实体类型。 我有一个属性定义其类型的实体。如果我可以告诉乌鸦DB根据属性将文档拆分为单独的集合,而不是创建新类并重新编译代码,那么问题可以概括为一个通用问题。 –

回答

3

斯蒂芬, 您可以决定使用集合名称提供逻辑:

store.Conventions.FindTypeTagName 

这是静态处理,使用泛型类型。 如果你想在运行时做出这个决定,你可以使用DocumentStoreListner

+0

您能确认我处理自定义集合名称的方式是否正确?先谢谢你 :) –

相关问题