实体框架DbContext工作者角色的生命周期

时间:2015-01-04 14:24:01

标签: c# entity-framework azure-worker-roles

我的工作角色每秒都会对数据库起作用。

在工作人员启动时初始化DbContext并在工作人员的整个生命周期内使用它是否可以?

如何处理数据库连接?如果数据库脱机并重新联机怎么办?我仍然可以使用上下文吗?

2 个答案:

答案 0 :(得分:2)

我的建议是为每个操作创建,使用和销毁上下文......不要挂在上面。 起初我常担心,因为我不知道创建DbContext有多昂贵,答案是,不是很好。

如果你试图继续重复使用DbContext实例,你也会遇到问题(很快),因为它的内部状态模型将开始报告先前加载(更新)的对象版本的冲突

答案 1 :(得分:2)

据我所知,主要的DbContext抽象是工作单元。

DbContext在需要时(即context.SaveChanges())打开并关闭数据库连接,因此数据库连接与上下文的范围无关。

通过这种方式,我现在认为,要确定DbContext实例的范围,您需要考虑您的工作单元及其在内存中管理的实体。

例如,我的问题是,通常在工作生命周期内使用单个上下文实例是没有意义的,因为:

  1. 通常,您将在每个角色调用中处理不同的实体。在这种情况下,上下文无论如何都需要将这些实体加载到内存中。

  2. 超时,上下文将管理内存中越来越多的实体,这会导致性能问题(因为它会扫描图表以查找更改和要做的事情)并最终导致内存问题。

  3. 长时间将实体保留在内存中会增加上下文中的实体与db中的实际数据之间出现不一致的可能性。解决这些不一致可能会降低性能。

  4. 总而言之,在worker角色的整个生命周期中使用相同的DbContext实例可能是错误的。

    根据您正在实施的工作单位决定DbContext思考的范围。