在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);
}
我已经将它变得有点脏的感觉,但这是存储/查询方式/删除指定集合名称时运行?还是我以这种方式陷入困境?
为什么你会有不同类型的产品,但使用相同的类类型?他们似乎没有那么不同。 –
就我而言,我正在研究一个通用框架,其中我有一个名为Entity的类。在运行时,可以在不创建新的C#类并重新编译任何代码的情况下配置新的实体类型。 我有一个属性定义其类型的实体。如果我可以告诉乌鸦DB根据属性将文档拆分为单独的集合,而不是创建新类并重新编译代码,那么问题可以概括为一个通用问题。 –