0

为什么当我使用这个单例时,负载检索总是空的?

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());
        }
    }
}
4

1 回答 1

1

你说你的对象有一个整数 Id 字段。因此,假设您有一个 Foo 对象,其 Id 设置为 1。Raven 将存储您的文档,文档 ID 为“foos/1”。

当您调用 Load 时,如果您传入整数 1,Raven 会正确地将其转换回“foos/1”字符串。但是因为您传入的是字符串“1”,所以 raven 只是假设该字符串代表整个文档 ID。在你的情况下,它没有。文档 ID 为“1”的文档不存在,因此您得到一个空值。

此外,通用 T 在商店中是多余的,您不妨只使用 object.

但是,请注意我关于不对 Raven 使用 Repository 模式的评论。它隐藏了 Raven 的绝大多数功能,并且在您开始查询时会给您带来麻烦。

于 2012-10-18T21:44:11.507 回答