2012-10-18 150 views
0

爲什麼當我使用這個單身人士的時候,加載retreive總是空?Embeded RavenDb的單身人士

public class DataLayer 
{ 
    private EmbeddableDocumentStore d; 
    private static object lockerSingleton = new object(); 

    private static DataLayer _current; 
    public static DataLayer RavenDB 
    { 
     get 
     { 
      lock (lockerSingleton) 
      { 
       if (_current == null) 
        _current = new DataLayer(); 
      } 
      return _current; 
     } 
    } 

    public DataLayer() 
    {   

       d = new EmbeddableDocumentStore() { DataDirectory = "csv" }; 
       d.Initialize();    
    } 

    public void store<T>(T obj) 
    { 
     using (var session = d.OpenSession()) 
     { 
      session.Store(obj); 
      session.SaveChanges(); 
     } 
    } 
    public T retrieve<T>(object ID) 
    { 
     using (var session = d.OpenSession()) 
     { 
      return session.Load<T>(ID.ToString()); 
     } 
    } 
} 
+0

請給我們一個'ID'的例子。 – maxbeaudoin

+0

Id是int或字符串 –

+0

按照約定Raven將ID編碼如下:'posts/1' if'T:Post'。所以只是傳遞1將不會工作..除非'T'具有'int'屬性'Id'? – maxbeaudoin

回答

1

你說你的對象有一個整數Id字段。假設你有一個Foo對象,它的Id設置爲1.Raven會將你的文檔存儲爲文件ID「foos/1」。

當您調用Load時,如果傳入整數1,Raven會將其正確轉換回「foos/1」字符串。但是因爲你傳遞的是字符串「1」,烏鴉只是假定字符串代表整個文檔ID。在你的情況下,它不。一個文檔不存在與文件ID「1」,所以你會得到一個空。

另外,通用T對存儲而言是多餘的,您可能還會使用對象。

但請注意我的評論,關於不使用Raven的Repository模式。它隱藏了Raven的絕大部分功能,並且在開始查詢時會給您帶來麻煩。

+0

THX我會嘗試它tomorow,在他建議爲每個http請求初始化會話,所以對於女士mvc 3對於每個行動是正確的嗎?你知道是否建議將初始化代碼放入global.asax的開始請求中? –

+0

如果這樣做,請確保在請求結束時處理它。烏鴉的指導說基地級你的控制器:http://ravendb.net/kb/3/using-ravendb-in-an-asp-net-mvc-website你也可以注入一個DI框架,實現一個每個網絡請求的生命週期。還有其他的選擇。所有真正重要的是每個請求都獲得自己的會話實例,但它們都共享同一個文檔存儲。 –

+0

正如你所說的導致問題的ToString(),謝謝 –