实体框架Core 2.0和UWP中DbContext的生命周期

时间:2018-01-31 17:46:11

标签: entity-framework uwp entity-framework-core

我目前正在将我的UWP应用程序从sqlite-net移动到使用Sqlite作为数据库提供程序的Entity Framework Core 2.0。我想知道的是生命DbContext对象应该具有的内容。

我已经看过Entity Framework和WPF的教程,这些教程建议您应该在详细信息视图的生命周期内保持DbContext的实例处于活动状态。这允许您在用户通过调用SaveAsync()按下按钮时更改模型并保存更改,或者通过简单地关闭视图来取消更改。我的应用程序将从此功能中受益匪浅。 (目前所有更改都会立即存储在数据库中,这不是最佳选择。)

我在保持DbContext一段时间后看到的问题是,在UWP中,应用程序可以随时暂停,内存可能会被擦除。我假设当应用程序重新启动时,EF将丢失对模型所做的所有更改。因此,从理论上讲,用户可能会在详细信息视图中更改模型,切换到另一个任务并执行一些导致大量内存使用的操作,这会导致我的应用程序终止。由于更改只存储在内存中,因此会丢失。

那么如何在UWP中接近DbContext的生命周期?我考虑过这些方法:

  1. 瞬间寿命,这意味着我无法使用 保存/取消机制
  2. 只要视图处于打开状态,
  3. 保持DBContext处于活动状态并接受 可能的,但可能不太可能丢失未保存的数据
  4. 只要视图打开并以某种方式序列化所有内容,
  5. 保持DBContext活着 应用程序暂停时对模型的更改。这可能会 需要复杂的逻辑来恢复模型的确切状态 用户离开了。

1 个答案:

答案 0 :(得分:1)

总体而言,在构建UWP应用时,建议尽快保存数据,以避免丢失用户数据的风险。这不仅适用于Entity Framework,也适用于其他数据存储选项。

问题在于临时(草稿)数据,因为在您的情况下是正在进行的工作形式。在这种情况下,您可能不希望将数据保存到数据库中。相反,您应该将数据存储在临时文件或local app settings中。重新打开应用程序后,您可以检查是否保存了一些临时数据并恢复应用程序的先前状态。您可以通过恢复整个Frame导航堆栈来更进一步。有一个很好的帮助类SuspensionManager,您可以将其用于此目的。

有关更多推荐,请参阅documentationUX guidelines