2012-12-05 153 views
2

我在RavenDB文檔看起來的樣子:RavenDB創建索引錯誤

{ 
    "ItemId": 1, 
    "Title": "Villa 
} 

用下面的元數據:

Raven-Clr-Type: MyNamespace.Item, MyNamespace 
Raven-Entity-Name: Doelkaarten 

所以我用一個類型MyNamespace.Item序列,但給它我自己的Raven-Entity-Name,所以它有自己的收藏。

在我的代碼定義索引:

public class DoelkaartenIndex : AbstractIndexCreationTask<Item> 
{ 
    public DoelkaartenIndex() 
    { 
     // MetadataFor(doc)["Raven-Entity-Name"].ToString() == "Doelkaarten" 
     Map = items => from item in items 
         where MetadataFor(item)["Raven-Entity-Name"].ToString() == "Doelkaarten" 
         select new {Id = item.ItemId, Name = item.Title}; 
    } 
} 

在它的「地圖」字段轉換索引:

docs.Items 
.Where(item => item["@metadata"]["Raven-Entity-Name"].ToString() == "Doelkaarten") 
.Select(item => new {Id = item.ItemId, Name = item.Title}) 

對索引的查詢從來沒有給結果。

如果地圖領域的手動更改爲它下面的工作代碼...

from doc in docs 
where doc["@metadata"]["Raven-Entity-Name"] == "Doelkaarten" 
select new { Id = doc.ItemId, Name=doc.Title }; 

怎麼可能在代碼中定義給出需要的結果的指數?

RavenDB使用:RavenHQ,構建#961

UPDATE:

我在做什麼是這樣的:我想使用SharePoint作爲CMS,並使用RavenDB作爲一個現成的只複製SharePoint列表數據。我創建了一個工具來從SharePoint列表同步到RavenDB。我有一個通用類型的項目,我從SharePoint列表項創建,並且我序列化到RavenDB。所以我所有的文檔都是Item類型的。但是他們來自不同屬性的列表,所以我希望能夠區分。你建議區分一個額外的財產,這將是完美的工作。但是接下來我會在一個大的Items集合中看到所有列表中的所有列表項目......您認爲這是解決此問題的最佳方法嗎?或者只是和它一起生活?我想使用索引來創建項目中所有數據的投影到我需要的實際數據。

回答

1

您不能用這種方法輕鬆更改集合的名稱。服務器端將使用Raven-Entity-Name元數據,但客戶端將通過在文檔存儲中註冊的約定來確定集合名稱。默認約定是使用實體的類型名稱。

您可以通過將一個新函數分配給DocumentStore.Conventions.FindTypeTagName來提供您自己的自定義約定 - 但這對於每個實體都可能很麻煩。您可以創建一個自定義屬性以應用於您的實體,然後編寫函數以查找並理解該屬性。

真的最簡單的方法就是打電話給你的實體Doelkaarten而不是Item

關於索引變化的原因 - 這不是因爲linq語法的切換。這是因爲你說from doc in docs而不是from doc in docs.Items。你可能可以完成from doc in docs.Doelkaartens而不是使用where子句。它們是等價的。有關更多示例,請參見this page in the docs

+0

嗨馬特,謝謝你的回答。我有太長的評論來進一步解釋我的問題。現在作爲問題的更新。任何想法的最佳途徑? –

+0

查看文檔中查詢多態實體的頁面。它應該回答你的問題。 http://ravendb.net/docs/client-api/querying/polymorphism –

+0

我決定製作Item的所有項目,並且不要混淆Raven-Entity-Name。多態性不適合我,沒有繼承...感謝您的時間! –