【问题标题】:Make sure Entity framework always reads from database?确保实体框架总是从数据库中读取?
【发布时间】:2011-04-21 18:17:59
【问题描述】:

我有这个应用程序,它实际上是两个应用程序,一个 Web 应用程序和一个控制台应用程序。控制台应用程序用作 Windows 机器上的计划任务,每天执行 3 次以执行一些重复性工作。两个应用程序都使用相同的模型和存储库,它们放置在单独的项目(类库)中。问题是,如果控制台应用程序需要对数据库进行一些更改,它会更新模型实体并将更改保存到数据库,但是当这种情况发生时,webbapplication 中的上下文不知道这一点,因此对象上下文不会被刷新新的/更新的数据和应用程序的用户看不到更改。

我的问题是:有没有办法告诉 objectcontext 总是从数据库中加载数据,无论是在洞 objectcontext 上还是针对特定查询?

/问候文布拉德

【问题讨论】:

    标签: entity-framework entity-framework-4 objectcontext


    【解决方案1】:

    每当你运行类似的东西时

    context.Entities.FirstOrDefault()
    

    或针对上下文的任何查询,数据实际上是从数据库中获取的,所以你应该没有问题。

    您在 web 应用中的 ObjectContext 生命周期是多少? ObjectContext 是一个 UnitOfWork,因此应该只创建它来获取/写入/更新数据并在之后快速处理。 您可以在这里找到类似的问题:

    Refresh ObjectContext or recreate it to reflect changes made to the database?

    【讨论】:

    • 这不是真的。如果您运行查询,修改数据库中的数据并在同一上下文中再次运行查询,您将不会收到新数据。 ObjectContext 实现了几种模式 - 这一种称为 Identity Map,这意味着同一键的实体只加载一次。
    • 感谢 Yakimych 提供的信息,您提供给我的链接让我朝着正确的方向前进,结果证明我需要对 Unity 中的 PerWebRequest 的支持(我使用了这个似乎有效的实现:@987654322 @)
    • @Ladislav - 感谢您的更正! @Vinblad - 很高兴我能帮上忙;)
    • 有解决这个问题的计划吗?
    【解决方案2】:

    我认为您不应该在 Web 应用程序中遇到这个问题。 Web 应用程序中的 ObjectContext 应根据请求创建,因此只有更新期间的请求处理才会受到影响。

    无论如何,很少有方法可以强制 ObjectContext 重新加载数据。查询和加载函数允许传递 MergeOption,它应该能够覆盖当前数据。但最有趣的应该是 Refresh 方法,尤其是 this application

    【讨论】:

      【解决方案3】:

      FWIW,在查询中创建一个新的(匿名)对象也会强制往返于数据库:

      ' queries from memory    
      context.Entities.FirstOrDefault()
      
      ' queries from db
      context.Entities.Select(Function(x) New With {p.ID, p.Name}).FirstOrDefault()
      

      请原谅 VB,这是我的母语语言 :)

      【讨论】:

        【解决方案4】:

        通过使用 DbSet,您还可以使用 .AsNoTracking() 方法。

        【讨论】:

        • 这实际上是一个很好的答案。只需添加 .AsNoTracking() 作为查询的一部分,实体框架将不依赖于对象的内存实例。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多