Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections 具有相同类型文档的不同RavenDB集合_Collections_Definition_Ravendb - Fatal编程技术网

Collections 具有相同类型文档的不同RavenDB集合

Collections 具有相同类型文档的不同RavenDB集合,collections,definition,ravendb,Collections,Definition,Ravendb,在RavenDB中,我可以存储Products和Categories类型的对象,它们将自动位于不同的集合中。这很好 但是,如果我有两种逻辑上完全不同的产品类型,但它们使用相同的类呢?或者代替2,我可以有一个通用的不同类型的产品数量。那么,是否可以告诉Raven将产品文档拆分为集合,比如说基于产品类上可用的字符串属性 先谢谢你 编辑: 我已经创建并注册了以下StoreListener,它更改了要存储在运行时的文档的集合。这将导致文档正确地存储在不同的集合中,从而对文档进行良好的逻辑分组 publi

在RavenDB中,我可以存储Products和Categories类型的对象,它们将自动位于不同的集合中。这很好

但是,如果我有两种逻辑上完全不同的产品类型,但它们使用相同的类呢?或者代替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)
存储/查询/删除:

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);
}
//存储
会话存储(实体);
//质疑
var someResults=session.Query(GetIndexName(entity.TypeId))。其中(e=>e.EntityId==entity.EntityId)
var somemoresults=session.Advanced.LuceneQuery(GetIndexName(entityTypeId)).Where(“TypeId:Colors AND Range.Basic.ColorCode:Yellow)
//删除
var loadedEntity=session.Query(GetIndexName(entity.TypeId))。其中(e=>
e、 EntityId==entity.EntityId).SingleOrDefault();
如果(loadedEntity!=null)
{
删除(loadedEntity);
}
我觉得它有点脏了,但这是在指定集合名称运行时存储/查询/删除的方式吗?还是我这样陷自己?

Stephan, 您可以使用以下方法提供决定集合名称的逻辑:

 store.Conventions.FindTypeTagName
这是使用泛型类型静态处理的。
如果您想在运行时做出决定,可以使用
DocumentStoreListner

提供该决定。为什么您会有不同类型的产品,但使用相同的类类型?那么它们似乎没有那么大的不同。在我的情况下,我正在处理一个通用框架,其中有一个名为Entity的类。在运行时,可以配置新的实体类型d,而不创建新的C#类和重新编译任何代码。我有一个定义其类型的实体属性。如果我可以告诉raven DB根据属性将文档拆分为单独的集合,而不是创建新类和重新编译代码,那么这个问题可以概括为一个一般性问题。你能确认我的处理方式吗d自定义集合名称是否正确?请提前感谢:)