【问题标题】:Reflect changes made by stored procedure in EF context反映存储过程在 EF 上下文中所做的更改
【发布时间】:2014-10-17 11:24:44
【问题描述】:

我正在使用SimpletInjector 使用以下代码在控制器中注入entity framework 上下文:

    private static void Initializer(Container container)
    {
        container.RegisterSingle<IDbContext,  SpotterContext>();
        container.RegisterSingle<IUnitOfWork, UnitOfWork>();
    }

我正在使用注入的上下文来执行存储过程,该存储过程将只有 UPDATEDELETE 使用以下代码的语句:

context.Database.ExecuteSqlCommand(<spname>, <params array>);         

我面临的问题是数据库中存储过程所做的更改没有反映在上下文中,当使用上下文访问更新的数据时,我得到的是旧数据而不是更新的数据。

如何在执行存储过程后更新context以从数据库中获取最新数据?

【问题讨论】:

  • 阅读this - 你不应该真正将上下文注册为单例。
  • 请注意@qujck 是正确的,并且您的问题是由使用 dbcontext 作为单例引起的。使用 Reload 方法可能看起来可以解决您的问题,但正如 qujck 的链接所解释的,dbcontext 不能跨线程和请求使用。

标签: c# sql-server entity-framework stored-procedures simple-injector


【解决方案1】:

最近不得不解决完全相同的问题。看起来,Reload() 上下文方法'Entry 成员工作得很好。

抱歉,我不懂 C#,所以无法发布关于该语言的代码示例。在 VB.NET 中是这样的:

Dim CurClient As Client = Ctx.Clients.Where(Function(cl) cl.Id = ClientId).First()

Ctx.Entry(Of Client)(CurClient).Reload()

这里,Ctx 是一个 EF 上下文。

我唯一还没有测试过的是这个方法是否也从子表中重新加载记录,如果它们存在的话。

【讨论】:

  • 非常感谢您给出的答案,但我对此有疑问。 “重新加载”调用会折叠其他用户设置的现有实体状态并从数据库加载数据吗?例如:用户1设置了一个实体状态为'modified',然后用户2进来执行存储过程并调用'Reload',那么'Reload'后用户1的实体状态保持不变,否则这些更改将丢失.
  • @Manikandhar,这取决于你有多少上下文。如果这些用户每个都有个人上下文,那么 User1 在他的个人上下文中所做的更改将不受影响。如果多个用户共享同一个 EF 上下文,那么是的,User1 的更改将会丢失。
  • 非常感谢罗杰,您指出的解决方案对我有用。再次感谢...!
  • 刷新父对象时上下文条目的Reload方法不会刷新子对象。它会刷新相应数据库表中某一特定行的数据。
猜你喜欢
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2022-01-11
  • 2015-11-02
  • 2013-08-22
  • 1970-01-01
  • 2022-09-11
  • 1970-01-01
相关资源
最近更新 更多