在实体框架中存储多个更改

时间:2009-05-27 14:46:06

标签: entity-framework entity

我正在尝试使用Entity Framework 1.0实现两阶段提交的形式。

我希望在高层实现的目标是:

  1. 从数据库中获取所有数据并将其存储在缓存中。
  2. 修改个别实体
  3. 将所有更改提交到数据库
  4. 到目前为止我遇到的问题是缓存IQueryable有点无意义,因为无论如何它都会回到数据库。所以另一个选择是使用IEnumberable来存储查询的结果,但这会阻止我继承一个查询并将其细化到另一个查询中(但我可以忍受它)。另一个问题是,只要EntityContext到期(我已设法在当前的httprequest中保留),就可以跟踪它。

    过去有没有人试图做过与此类似的事情或有任何指示?

    非常感谢, 马特

    jumpingmattflash.co.uk

2 个答案:

答案 0 :(得分:1)

IQueryable只是一个可查询对象而不是实际数据。

您需要运行ToList才能获取数据。

如果您可以保持Context打开并使用transactionscope,您可以执行您要执行的操作。但在大多数情况下,这是不可能的。这也会锁定导致其他问题的数据库。

更好的方法是:

  • 从数据库中读取数据
  • 处理上下文
  • 客户需要进行任何更改
  • 打开新上下文
  • 再次阅读数据。
  • 通过将数据从已更改的数据复制到第二组
  • 进行更改
  • 提交更改
  • 处理上下文

答案 1 :(得分:0)

在数据库的.ToList()结果上调用IQueryable。然后使用.AsQueryable()开始改进其他查询。这应该可以解决你的第一个问题。

至于你的第二个问题,我也在寻找解决方案。据我所知,实体框架关系的底层实现围绕ObjectStateManager程序集的System.Data.Objects命名空间中的System.Data.Entity。这反过来使用MetadataWorkspace命名空间中的System.Data.Metadata.Edm类来查找关系映射。这些可以在没有底层数据库连接的情况下使用,如果是这样,将提供一些非常常规的工具来更新复杂的对象图。

如果上下文以与各个实体类似的方式进行分离和附加,那将是很好的。看起来实体框架的下一个版本将关注这些特定类型的问题;处理实体和上下文时更自由。