为什么当我使用这个单例时,load retreive总是为空?
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 :(得分:1)
您说您的对象有一个整数Id字段。因此,假设您有一个Foo的对象,其Id设置为1. Raven将使用文档ID“foos / 1”存储您的文档。
当您调用Load时,如果传入整数1,Raven会将其正确转换回“foos / 1”字符串。但是因为你传入字符串“1”,raven只是假设字符串代表整个文档id。在你的情况下,它没有。文档ID为“1”的文档不存在,因此您将获得null。
此外,通用T在商店中是多余的,您也可以只使用对象。
但是请注意我没有在Raven中使用Repository模式的评论。它隐藏了Raven的绝大部分功能,并在您开始查询时遇到麻烦。