我现在有一个包含两部分的应用程序

  • 一个查看器,它使用EF
  • 从数据库接收数据
  • 一种在运行时处理数据库中数据的服务。

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

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

    现在的问题是-我如何每隔几分钟就能检索一次数据库数据?我知道以下两个问题:
  • 这不是我的存储库正在“加载”的最新数据-EF是否“智能”填充并从本地缓存中检索数据?如果是这样,如何强制EF从数据库加载数据?
  • 无法重新设置整个ObservableCollection或从另一个线程/背景工作人员(通过调用)添加/删除实体。我应该如何解决呢?

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

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

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

    编辑2:

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

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

    编辑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/

    10-11 04:38
    查看更多