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

C# 如何在对数据库进行外部更改后更新/同步DbContext,c#,entity-framework,entity-framework-6,dbcontext,C#,Entity Framework,Entity Framework 6,Dbcontext,我使用的是EntityFramework6,出于性能原因,我预先将实体加载到我的DbContext中,然后在本地使用它们。到目前为止,对数据库的所有更改都通过了DbContext,因此我的本地实体和数据库是同步的。但是,我现在必须在数据库上调用一个存储过程,它的副作用是对需要反映在实体中的表(DbContext之外)进行更改。所谓更改,是指添加新记录和删除/更新现有记录 我不想丢弃我的DbContext并创建一个新的,因为一些实体实例被包装在ViewModel类中。因此,以这种方式删除DbCon

我使用的是EntityFramework6,出于性能原因,我预先将实体加载到我的
DbContext
中,然后在本地使用它们。到目前为止,对数据库的所有更改都通过了
DbContext
,因此我的本地实体和数据库是同步的。但是,我现在必须在数据库上调用一个存储过程,它的副作用是对需要反映在实体中的表(DbContext之外)进行更改。所谓更改,是指添加新记录和删除/更新现有记录

我不想丢弃我的
DbContext
并创建一个新的,因为一些实体实例被包装在
ViewModel
类中。因此,以这种方式删除
DbContext
将导致UI中出现重大问题

我的理解是,只要在
DbContext
的所有
dbset
上调用
Load()
,就会替换现有实例。因此,任何使用旧实体实例的对象都无法工作

因此,我想我可以使用
Reload
方法,比如:

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

因此,我正在寻找一种方法:

  • 从数据库加载my
    DbContext新增的实体
  • 在my
    DbContext中重新加载现有实体
  • 从my
    DbContext中删除所有已删除的实体

  • 这是实体框架的官方文档。
    从对数据库情况的分析开始,它提出了获取所需内容的智能快速方法,详细说明了必要的数据读取策略(如快速加载或延迟加载),或者提供了正确使用代码生成和向导GUI的教程

    这里有一些关于数据读取策略的更详细信息和教程:

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

    说到SP,它可以简单地通过实体框架附带的向导进行映射,并通过方法进行包装


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

    一般来说,EntityFramework无法察觉数据库中的更改并更新
    dbcontext
    。没有针对它的优化或EntityFramework内置解决方案


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

    难道您不能在实体框架中映射存储过程吗?它们是可以像映射表一样映射的db对象。我认为,如果您将它们映射到模型中,您的上下文将反映由它们引起的更改。您是否已经尝试过这种方法?@moro91首先,我不知道您可以这样做,即让DbContext对存储过程做出反应。但无论如何,我没有“模型”,所以您使用的是代码优先的方法,即不从现有数据库请求自动映射?在这里你可以找到一个关于这个话题的简单解释:@moro91,谢谢你的回复,但是我不理解链接中的信息。这似乎表明存储的过程将在DbContext.SaveChanges()上执行,但这不是我想要的。SP在不同的时间执行。在任何情况下,我都不确定我是否理解链接中的示例以及它在我的场景中的工作方式,因为有多个表受到其操作的影响。如果存储过程是由不属于您通常的应用程序数据访问的某个内容触发的,则您无法在dbcontext中自动更新数据,因为您使用的是即时加载。您的dbcontext很重,不太一致。获取更新数据的唯一方法是每次完全重新加载上下文。我想我错过了一些信息:它是web应用程序还是桌面应用程序?是单用户还是多用户?如何处理数据上的并发性?我认为这些先决条件对于评估解决问题的最佳方法非常重要。感谢您提供这些信息。您是否能够展开我可以在哪里找到映射SP的向导?即使我坚持当前的“代码优先”策略,而不是采用数据库优先的方法,我也能做到这一点吗?这就是开始时需要知道的一切:再次感谢您的帮助。非常感谢。