数据库外部更改后如何更新/同步DbContext

问题描述 投票:0回答:2

我正在使用 Entity Framework 6,出于性能原因,我将实体预先加载到我的

DbContext
中,然后在本地使用它们。到目前为止,对数据库的所有更改都已通过
DbContext
,因此我的本地实体和数据库已同步。但是,我现在必须在数据库上调用存储过程,这会产生副作用,即对需要反映在我的实体中的表(DbContext 外部)进行更改。我所说的更改是指添加新记录并删除/更新现有记录。

我不想丢弃我的

DbContext
并创建一个新的,因为某些实体实例包含在
ViewModel
类中。因此,以这种方式删除
DbContext
会导致 UI 出现重大问题。

据我所知,简单地在

Load()
的所有
DbSets
上调用
DbContext
只会替换现有实例。因此,任何使用旧实体实例的对象都将不起作用。

所以,我想我可以使用

Reload
方法,例如:

context.Entry(entity).Reload();

这将更新我的本地实体,但我只能对

DbContext
已经知道的实体执行此操作。它不涵盖由于执行存储过程而创建/删除的任何新实体或已删除实体。

所以,我正在寻找一种方法:

  1. 从数据库加载我的新实体
    DbContext
  2. 重新加载我的
    DbContext
  3. 中的现有实体
  4. 从我的
    DbContext
  5. 中删除所有已删除的实体
c# entity-framework entity-framework-6 dbcontext
2个回答
1
投票

这里是实体框架的官方文档。
从分析您的数据库情况开始,它建议智能快速的方法来获取您想要的内容,详细说明必要时的数据读取策略(例如急切或延迟加载)或提供正确使用代码生成和向导 GUI 的教程。

http://www.entityframeworktutorial.net/choosing-development-approach-with-entity-framework.aspx

这里有一些有关数据读取策略的更详细的信息和教程:
https://www.c-sharpcorner.com/article/eager-loading-lazy-loading-and-explicit-loading-in-entity-framework/

正如我在评论中已经告诉过你的那样,我建议采用数据库优先的方法并使用延迟加载以避免不受控制的数据行为(或在运行存储过程时重新加载整个数据库)。

说到SP,可以简单地通过Entity Framework自带的Wizard进行映射,并通过方法进行包装。

希望这些资源对您有所帮助!


-1
投票

一般来说EntityFramework无法感知数据库的变化并进行更新

dbcontext
。没有针对它的优化或EntityFramework内置解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.