IIS重置/容器超出范围后,不会返回db4o ...对象的问题

时间:2009-05-30 00:00:56

标签: c# db4o

所以我可能正在做db4o的悲剧性错误导致这个问题发生......但每次重置我的上下文时我都会失去所有的对象。我的意思是,只要我的容器对象超出范围(由于IIS重置或其他),我就不能再检索我之前持久存在的任何对象。在“会话”的范围内,我可以检索所有内容,但只要“会话”终止,就不会返回任何内容。奇怪的是,数据库文件的大小继续增长,所以我知道一切都在那里,事实上它永远不会被返回。知道发生了什么事吗?

这是db4o的通用包装器:

public class DataStore : IDisposable {

    private static readonly object serverLock = new object();
    private static readonly object containerLock = new object();

    private static IObjectServer server;
    private static IObjectContainer container;

    private static IObjectServer Server {
        get {
            lock (serverLock) {
                if (server == null)
                    server = Db4oFactory.OpenServer(ConfigurationManager.AppSettings["DatabaseFilePath"], 0);
                return server;
            }
        }
    }

    private static IObjectContainer Container {
        get {
            lock (containerLock) {
                if (container == null)
                    container = Server.OpenClient();
                return container;
            }
        }
    }

    public IQueryable<T> Find<T>(Func<T, bool> predicate) {
        return (from T t in Container where predicate(t) select t).AsQueryable();
    }

    public IQueryable<T> Find<T>() {
        return (from T t in Container select t).AsQueryable();
    }

    public ValidationResult Save(IValidatable item) {
        var validationResult = item.Validate();
        if (!validationResult.IsValid) return validationResult;
        Container.Store(item);
        return validationResult;
    }

    public void Delete(object item) {
        Container.Delete(item);
    }

    public void Dispose() {
        Server.Close();
        Container.Close();
    }
}

1 个答案:

答案 0 :(得分:1)

我认为你在Save方法中缺少commit语句。

戈兰