【问题标题】:Entity Framework: How to detect external changes to database实体框架:如何检测对数据库的外部更改
【发布时间】:2013-09-16 13:33:48
【问题描述】:

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

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

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

我正在使用 Entity Framework 5,目标是 .NET 4.0

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

【问题讨论】:

  • 恐怕你不能这样做。而且,也许这很好,因为在其他情况下,在此全局上下文刷新整个数据库中,您的应用程序将被选中。
  • 我想知道,如果您已经兑现,DBContext 也总是直接从数据库中获取数据。您必须刷新数据而不是 dataContext 我的意思是从数据库重新加载数据?
  • @BassamAlugili,我已经澄清了问题,请看一下编辑。
  • 使用 SignalR 这绝对是可能的。查看 Brij 的这篇博文:techbrij.com/…
  • @Serv,这看起来是一个不错的工具,但我没有收到有关更改的通知的问题。我不能强制 EF 从数据库加载更新的数据。它不会更新已更改实体的属性。

标签: c# database entity-framework stored-procedures


【解决方案1】:

您的DbContext 应该是短暂的。创建它,运行您的查询,然后释放它。

using (var context = new MyProject.DbContext())
{
    // run your query here
}

不要保留上下文。这样您就不会对旧数据有任何问题。

【讨论】:

  • 我对存储库使用相同的上下文,并且上下文由 IoC 注册。
  • @Mert 使用 IoC 库,您仍然可以拥有短暂的上下文。例如,使用 Autofac 和 Web API 你可以做builder.Register(c => context).As<IIntranetContext>().InstancePerApiRequest();
  • 问题是我需要重新初始化所有 repo,因为它们取决于上下文。服务层与 repo 的非上下文交互。
  • @IvanFerrerVilla 抱歉没有早点回复,我一定错过了通知。通常,您会在检索实体后立即将它们映射到业务对象或视图模型(或其他东西)。要更新,您可以再次检索实体并修改属性(更容易),或者手动附加仅设置了主键字段的实体,填写属性并将它们标记为已更改(无 select 查询执行)。我已经有几年没有积极使用 EF 了,所以我跟不上当今的最佳实践。
  • @IvanFerrerVilla 有关手动附加方法的示例,请参见 stackoverflow.com/a/17442858/247702
【解决方案2】:
db = new DbContext())
var context= ((Infrastructure.IObjectContextAdapter)db).ObjectContext;
context.Refresh(Core.Objects.RefreshMode.StoreWins, context.ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged | EntityState.Modified))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多