gpt4 book ai didi

c# - 如何...显示数据库中的数据

转载 作者:太空狗 更新时间:2023-10-29 23:43:55 24 4
gpt4 key购买 nike

我现在有一个应用程序,它由两部分组成

  1. 使用 EF 从数据库接收数据的查看器
  2. 在运行时操作数据库中数据的服务。

幕后逻辑包括一些项目,例如存储库 - 数据访问是通过一个工作单元实现的。 Viewer 本身是一个带有底层 ViewModel 的 WPF 表单。

ViewModel 包含一个 ObservableCollection,它是我的 Viewer 的数据源。

现在的问题是 - 我如何能够每隔几分钟检索一次数据库数据?我知道以下两个问题:

  1. 我的存储库正在“加载”的不是最新数据 - EF 是否“智能”处理并从本地缓存检索数据?如果是这样,我如何强制 EF 从数据库加载数据?
  2. 重新设置整个 ObservableCollection 或从另一个线程/后台 worker (通过调用)添加/删除实体是不可能的。我该如何解决这个问题?

如果需要,我会添加一些我的代码,但目前我认为这根本没有帮助。

编辑:

public IEnumerable<Request> GetAllUnResolvedRequests() {
return AccessContext.Requests.Where(o => !o.IsResolved);
}

这段代码不会获取最新数据 - 我手动编辑了一些行(将 IsResolved 设置为 true),但此方法仍然会检索它。

编辑2:

Properties after editing data manually in database

Data in the database

编辑3:

var requests = AccessContext.Requests.Where(o => o.Date >= fromDate && o.Date <= toDate).ToList();
foreach (var request in requests) {
AccessContext.Entry(request).Reload();
}
return requests;

最后一个问题:上面的代码“解决”了这个问题——但在我看来它并不干净。还有别的办法吗?

最佳答案

当您访问数据库中的实体时,该实体会被缓存(并被跟踪以跟踪您的应用程序所做的更改,直到您指定 AsNoTracking)。
这有一些问题(例如,性能问题,因为缓存增加或您看到的是旧版本的实体)。
出于这个原因,在使用 EF 时,您应该使用工作单元模式(即,您应该为每个工作单元创建一个新的上下文)。

您可以查看这篇 Microsoft 文章,了解如何实现工作单元模式。 http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

在您的情况下,使用 Reload 不是一个好的选择,因为该应用程序不可扩展。对于每次重新加载,您都在对数据库进行查询。如果您只需要返回所需的实体,最好的方法是创建一个新的上下文。

public IEnumerable<Request> GetAllUnResolvedRequests() 
{
return GetNewContext().Requests.Where(o => !o.IsResolved).ToList();
}

关于c# - 如何...显示数据库中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38921303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com