C# 用于快速更改状态的EF DbContext生存期

C# 用于快速更改状态的EF DbContext生存期,c#,.net,database,entity-framework,desktop-application,C#,.net,Database,Entity Framework,Desktop Application,我有一个桌面应用程序,它使用绑定到SQLServerCompact的实体框架来实现持久性。应用程序存储各种“传统”记录(定期访问,但不经常修改),但它也用于持久化用于在会话之间恢复应用程序状态的高度可变状态 我读过的关于实体框架的大多数建议都涉及保持DbContext生存期相对较短(甚至可能是方法范围?),以避免随着时间的推移过度使用内存。然而,对于高度可变的状态,似乎拥有更长的寿命是有意义的;然而,可变状态会在应用程序的整个生命周期内持续存在,这意味着在整个应用程序生命周期内保持上下文的活动状

我有一个桌面应用程序,它使用绑定到SQLServerCompact的实体框架来实现持久性。应用程序存储各种“传统”记录(定期访问,但不经常修改),但它也用于持久化用于在会话之间恢复应用程序状态的高度可变状态

我读过的关于实体框架的大多数建议都涉及保持DbContext生存期相对较短(甚至可能是方法范围?),以避免随着时间的推移过度使用内存。然而,对于高度可变的状态,似乎拥有更长的寿命是有意义的;然而,可变状态会在应用程序的整个生命周期内持续存在,这意味着在整个应用程序生命周期内保持上下文的活动状态

我考虑过只为可变状态保留一个单独的DbContext实例,然后为其他操作使用方法范围的上下文,但这会遇到问题,因为可变状态对修改频率较低的记录具有(只读)引用;当我试图从另一个DbContext修改它们时,这会导致错误。我正在寻找有更多使用EF经验的开发人员的建议,以了解如何正确地构建这个框架

以下是我目前的想法:

  • 对所有可变状态及其引用的任何记录使用一个具有应用生命周期的DbContext
  • 仅对独立记录(如数据更改历史记录和存档对象)使用单独的DbContext实例
  • 这仍然会让大量数据库一直驻留在内存中,但我不确定这里还有什么可以工作。数据库大小不是太大(只有数千条记录),所以这可能没问题


    建议?

    我认为你的设计会很好。此外,您可能需要考虑“存储库”模式。它是数据库和应用程序之间的中介,仅用于EF。你可以把刷新规则放在那里,比如“每5分钟只向数据库更新一次内容”或者“如果我们的内存中已经有这个集合,并且它最后一次刷新是在10分钟前,那么不要查询数据库。等等。生命周期听起来还可以(尽管我不喜欢一般原则上的想法)。但是,如果您执行任何多线程操作,请务必小心:DbContext不喜欢它。如果出于性能原因,您考虑让DbContext保持长时间的活动状态,我建议EF不是解决问题的正确选择。如果应用程序状态是用户或工作站的本地状态(听起来可能是),那么也许SQL Server也不是最佳选择。@Keith,动机主要不是性能(尽管这很重要),而是导航属性带来的复杂性,因为我想保留状态对象。我使用数据库而不是其他专有存储的动机是希望在崩溃或突然断电等情况下保持引用完整性。@simon,我刚刚意识到,这可能适用于n导航属性,即使我试图锁定对“全局”上下文的访问。这确实会产生一些问题。。。