Indexing 为什么我需要用下划线命名索引中的属性?

Indexing 为什么我需要用下划线命名索引中的属性?,indexing,ravendb,Indexing,Ravendb,鉴于我有以下结构(去掉不必要的细节) 如果我有很多这类产品存储在raven中,并且我想通过制造商id(或者其他一些东西)对它们进行索引,我会制作一个这样的索引(当然在现实生活中,这个索引还包含一些其他信息…) 公共类ProductManufacturerIndex:AbstractIndexCreationTask{ 公共产品制造商索引(){ 映射=产品=>来自产品中的产品 选择新的{ 制造商标识=产品.Manufacturer.Id, }; } } 我的问题是,为什么我需要命名我的现场制造商

鉴于我有以下结构(去掉不必要的细节)

如果我有很多这类产品存储在raven中,并且我想通过制造商id(或者其他一些东西)对它们进行索引,我会制作一个这样的索引(当然在现实生活中,这个索引还包含一些其他信息…)

公共类ProductManufacturerIndex:AbstractIndexCreationTask{
公共产品制造商索引(){
映射=产品=>来自产品中的产品
选择新的{
制造商标识=产品.Manufacturer.Id,
};
}
}
我的问题是,为什么我需要命名我的现场制造商Id?如果我没有将其命名为Manufacturer\u Id,则在尝试查询索引时会出现异常,因为Manufacturer Id列没有索引

基本上,为什么我不能这样做?(这是我的第一个猜测)

公共类ProductManufacturerIndex:AbstractIndexCreationTask{
公共产品制造商索引(){
映射=产品=>来自产品中的产品
选择新的{
product.Manufacturer.Id,
};
}
}

RavenDB使用一种命名约定。如果没有正确命名字段,它就不知道如何映射

在本例中,您使用的第二个索引具有Id属性,但RavenDB无法知道您映射了制造商的Id,而不是根Id


这就是为什么我们有这个公约。如果你真的想更改它,你可以更改它,但通常不建议这样做。

好吧……如果你这样说,这是有道理的。我猜这也会在结构中“向下”起作用?例如,如果我的制造商也有一个Location对象,我应该称之为Manufacturer\u Location\u Id,依此类推?
public class Product {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Manufacturer Manufacturer { get; set; }
}

public class Manufacturer {
    public Guid Id { get; set; }
    public string Name { get; set; }
}
public class ProductManufacturerIndex : AbstractIndexCreationTask<Product> {
    public ProductManufacturerIndex() {
        Map = products => from product in products
                          select new {
                              Manufacturer_Id = product.Manufacturer.Id,
                          };
    }
}
public class ProductManufacturerIndex : AbstractIndexCreationTask<Product> {
    public ProductManufacturerIndex() {
        Map = products => from product in products
                          select new {
                              product.Manufacturer.Id,
                          };
    }
}