在对数据库进行外部更改之后,如何更新/同步DbContext

时间:2018-11-16 15:19:45

标签: c# entity-framework entity-framework-6 dbcontext

我正在使用Entity Framework 6,出于性能原因,我先将实体加载到DbContext中,然后在本地使用它们。到目前为止,对数据库的所有更改都经过了DbContext,因此我的本地实体和数据库已经同步。但是,我现在必须在数据库上调用存储过程,这具有对表(在DbContext外部)进行更改的副作用,这些更改需要反映在我的实体中。通过更改,我的意思是它正在添加新记录并删除/更新现有记录。

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

据我了解,仅在DbSets的所有DbContext上调用Reload只会替换现有实例。因此,使用旧实体实例的任何对象均不起作用。

所以,我认为我可以使用context.Entry(entity).Reload(); 方法,例如:

DbContext

这将更新我的本地实体,但是我只能对DbContext已经知道的实体执行此操作。它不包括由于执行存储过程而创建/删除的任何新实体或DELETED实体。

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

  1. 从数据库中加载我的DbContext的新实体
  2. 重新加载我的DbContext中的现有实体
  3. 从我的/home/airflow/gcs上删除所有已删除的实体

有人可以为此提供任何帮助吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

这是Entity Framework的官方文档。
从对数据库情况的分析开始,它提出了一些聪明而又快速的方法来获取所需内容,详细介绍了必要的数据读取策略(例如急切或延迟加载)或提供了正确使用代码生成和向导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附带的向导将其映射并用方法包装。

希望您会发现这些资源很有帮助!

答案 1 :(得分:0)

通常,EntityFramework无法识别数据库中的更改并更新dbcontext。没有针对它的优化或EntityFramework内置解决方案。

我认为您可以在SqlServer中使用CDC,将更改推送到应用程序并更新dbcontext。但这不是适用于所有业务和业务的解决方案