我继承了一个运行在IIS下的Server数据库的VisualStudio 2019 C# DevExpress Blazor XPO项目,并且一直在缓存页面数据。
项目本身被定义为为64位操作构建的.NET 5.0控制台应用程序。
我对DevExpress或Blazor没有经验,并且正在学习,我已经能够使用visual在DevExpress下运行调试应用程序。
我尝试刷新正在显示数据的DxDataGrid,但是通过将日志添加到文件中,我已经确定从数据库查询返回的数据没有变化。我已经使用确认这些更改已应用于实际数据库,因此我相信我正在获得缓存的数据。
我相信这种缓存与底层的UnitOfWork缓存有关,但是不管我尝试了什么,数据总是被缓存的,除非我做了实际的网页刷新,否则我无法获得显示的更改。
基类包含一个名为UnitOfWork的readUniOfWork,它用于获取该类的所有数据。这个readUnitOfWork是在类被实例化并且是类的只读属性时创建的。
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
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“,但这并没有改变行为。我可以调试并查看项数据中发生的更改,并将这些更改保存到数据库中,但是当读取发生时,数据仍然是旧的数据。刷新页面将正确返回更新的数据。
欢迎任何建议或指向一个例子项目。
发布于 2022-07-18 03:28:35
我找到了这个问题的答案,我在这里张贴,以防其他人发现同样的问题,这是有帮助的。
深入研究代码后,我发现所有的持久数据存储都将OptimisticLocking设置为false。
[Persistent("qCustomer"), OptimisticLocking(false)]
在DevExpress上搜索时,我发现“如果没有乐观锁定,XPO无法确定某个特定对象是否被修改”。这意味着数据总是从缓存加载的。
然后我发现“使用当前会话加载的所有持久对象都存储在标识映射中,DropIdentityMap方法使对象引用无效,使垃圾收集器能够释放以后会话对象占用的空间。
调用DropIdentityMap方法与重新连接会话具有相同的效果。“
在更新记录后,更改更新函数以调用DropIdentityMap,解决了我的问题。
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();
https://stackoverflow.com/questions/72988920
复制相似问题