C# 实体框架:如何检测对数据库的外部更改

C# 实体框架:如何检测对数据库的外部更改,c#,database,entity-framework,stored-procedures,C#,Database,Entity Framework,Stored Procedures,我有一个存储过程,可以更改数据库中的大量数据。此存储过程由同时使用EF进行数据操作的应用程序调用 所以我点击一个按钮,存储过程在数据库中运行,数据被更改,EF向用户显示旧数据 有没有办法强制DbContext或ObjectContext刷新数据库中的数据?ObjectContext.Refresh()可能是解决方案,但我不想为每个可能更改的表调用此方法。我希望所有的表都能在一次移动中刷新 我正在使用EntityFramework5,目标是.NET4.0 编辑:添加的数据可用,但EF不会反映对现有

我有一个存储过程,可以更改数据库中的大量数据。此存储过程由同时使用EF进行数据操作的应用程序调用

所以我点击一个按钮,存储过程在数据库中运行,数据被更改,EF向用户显示旧数据

有没有办法强制DbContext或ObjectContext刷新数据库中的数据?ObjectContext.Refresh()可能是解决方案,但我不想为每个可能更改的表调用此方法。我希望所有的表都能在一次移动中刷新

我正在使用EntityFramework5,目标是.NET4.0


编辑:添加的数据可用,但EF不会反映对现有数据的修改。我看到了新添加的记录,但看不到对现有记录所做的更改。

您的
DbContext
应该是短期的。创建它,运行查询,然后处理它

db = new DbContext())
var context= ((Infrastructure.IObjectContextAdapter)db).ObjectContext;
context.Refresh(Core.Objects.RefreshMode.StoreWins, context.ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged | EntityState.Modified))
using (var context = new MyProject.DbContext())
{
    // run your query here
}

不要保留你的上下文。这样,您就不会对旧数据产生任何问题。

恐怕您无法做到这一点。也许这是好的,因为在另一种情况下,在这个全局上下文刷新中,整个数据库都将被选择到应用程序中。我想知道的是,如果您已经兑现,DBContext也总是直接从数据库中获取数据。你必须重新刷新你的数据,而不是dataContext我是说从DB重新加载数据?@BassamAlugili,我已经澄清了问题,请查看编辑。使用SignalR,这是完全可能的。查看Brij的这篇博文:@Serv,这看起来是一个很好的工具,但我没有收到关于更改的通知的问题。我无法强制EF从数据库加载更新的数据。它不会更新已更改的实体的属性。我对存储库使用相同的上下文,该上下文由IoC注册。@Mert使用IoC库时,您仍然可以使用短期上下文。例如,使用Autofac和Web API,您可以执行
builder.Register(c=>context).As().InstancePerApiRequest()问题是我需要重新初始化所有回购协议,因为它们取决于上下文。服务层与repo的not上下文进行交互。@IvanFerrerVilla很抱歉之前没有响应,我一定错过了通知。通常,您将在检索实体后立即将其映射到业务对象或视图模型(或其他对象)。要更新,您可以再次检索实体并修改属性(更容易),或者手动附加一个仅设置了主键字段的实体,填写属性并将其标记为已更改(无
选择
查询已执行)。我已经有几年没有积极使用EF了,所以我没有跟上当今最佳实践的速度。@IvanFerrerVilla请参阅手动附加方法的示例。