在RavenDB中,我可以存储Products和Categories类型的对象,它们将自动位于不同的集合中。这很好。
但是,如果我有2种逻辑上完全不同类型的产品但是它们使用相同的类呢?或者代替2,我可以拥有通用数量的不同类型的产品。那么是否有可能告诉Raven将产品文档拆分为集合,假设基于Product类可用的字符串属性?
提前谢谢你。
修改 我创建并注册了以下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'作为新raven集合的名称(以及实体类型的名称也保存为EntityData对象上的单独字段)。
我如何回顾我的物品?在执行查询之前,我找不到可以在运行时定义集合的位置。
我是否必须执行一些原始的lucene查询?或者我可以实现一个查询监听器吗?
修改 我找到了一种使用动态定义的集合存储,查询和删除对象的方法,但我不确定这是正确的方法:
文档商店监听器:
(我使用上面定义的类)
解析索引名称的方法:
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 :(得分:3)
斯蒂芬, 您可以使用以下命令提供用于决定集合名称的逻辑:
store.Conventions.FindTypeTagName
使用泛型类型静态处理。
如果您想在运行时做出决定,可以使用DocumentStoreListner