首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Blazor项目中的单元数据总是被缓存的,如何从数据库中获取数据?

Blazor项目中的单元数据总是被缓存的,如何从数据库中获取数据?
EN

Stack Overflow用户
提问于 2022-07-15 04:02:31
回答 1查看 88关注 0票数 0

我继承了一个运行在IIS下的Server数据库的VisualStudio 2019 C# DevExpress Blazor XPO项目,并且一直在缓存页面数据。

项目本身被定义为为64位操作构建的.NET 5.0控制台应用程序。

我对DevExpress或Blazor没有经验,并且正在学习,我已经能够使用visual在DevExpress下运行调试应用程序。

我尝试刷新正在显示数据的DxDataGrid,但是通过将日志添加到文件中,我已经确定从数据库查询返回的数据没有变化。我已经使用确认这些更改已应用于实际数据库,因此我相信我正在获得缓存的数据。

我相信这种缓存与底层的UnitOfWork缓存有关,但是不管我尝试了什么,数据总是被缓存的,除非我做了实际的网页刷新,否则我无法获得显示的更改。

基类包含一个名为UnitOfWork的readUniOfWork,它用于获取该类的所有数据。这个readUnitOfWork是在类被实例化并且是类的只读属性时创建的。

代码语言:javascript
运行
复制
        public Task<IQueryable<T>> Get(System.Linq.Expressions.Expression<System.Func<T, bool>> criteria = null)
    {
        var query = (IQueryable<T>)readUnitOfWork.Query<T>();
        //IQueryable<T> query = new XPQuery<T>(readUnitOfWork);
        if (criteria != null)
            query = query.Where(criteria);
        return Task.FromResult(query);
    }

update函数为每次更新创建一个新的UnitOfWork

代码语言:javascript
运行
复制
        public async Task<T> Update(T item, IDictionary<string, object> values)
    {
        try
        {
            using (UnitOfWork uow = CreateModificationUnitOfWork())
            {
                item = uow.GetObjectByKey<T>(item.Oid);
                PopulateObjectHelper.PopulateObject(item, values);
                await uow.CommitChangesAsync();
            }
            return await readUnitOfWork.GetObjectByKeyAsync<T>(item.Oid, true);
        }
        catch (Exception e)
        {
            _Logger.Error(e);
            throw;
        }
    }

我尝试将更新函数更改为也使用相同的UnitOfWork "readUnitOfWork“,但这并没有改变行为。我可以调试并查看项数据中发生的更改,并将这些更改保存到数据库中,但是当读取发生时,数据仍然是旧的数据。刷新页面将正确返回更新的数据。

欢迎任何建议或指向一个例子项目。

EN

回答 1

Stack Overflow用户

发布于 2022-07-18 03:28:35

我找到了这个问题的答案,我在这里张贴,以防其他人发现同样的问题,这是有帮助的。

深入研究代码后,我发现所有的持久数据存储都将OptimisticLocking设置为false。

代码语言:javascript
运行
复制
    [Persistent("qCustomer"), OptimisticLocking(false)]

在DevExpress上搜索时,我发现“如果没有乐观锁定,XPO无法确定某个特定对象是否被修改”。这意味着数据总是从缓存加载的。

然后我发现“使用当前会话加载的所有持久对象都存储在标识映射中,DropIdentityMap方法使对象引用无效,使垃圾收集器能够释放以后会话对象占用的空间。

调用DropIdentityMap方法与重新连接会话具有相同的效果。“

在更新记录后,更改更新函数以调用DropIdentityMap,解决了我的问题。

代码语言:javascript
运行
复制
                using (UnitOfWork uow = CreateModificationUnitOfWork())
            {
                item = uow.GetObjectByKey<T>(item.Oid);
                PopulateObjectHelper.PopulateObject(item, values);
                await uow.CommitChangesAsync();
            }
            // Tell XPO to reload from the database by voiding the current store
            readUnitOfWork.DropIdentityMap();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72988920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档