【问题标题】:Entity Framework 4: ObjectContext event on successful save实体框架 4:成功保存时的 ObjectContext 事件
【发布时间】:2011-12-31 12:50:10
【问题描述】:

有没有一种好方法可以检测ObjectContext 更改何时实际提交?

SavingChanges 在进入数据存储之前发生,但我还需要一种方法来了解这些更改是否实际提交。

提前致谢 约翰

更新:

我拥有的是代码优先的 DbContext。这被输入到动态数据中,正如我发现的那样,它使用 DbContext 的内部 ObjectContext(在转换为 IObjectContextAdapter 时我可以访问它)。不调用 dbcontext 的 SaveChanges,而是使用 objectcontext 的 SaveChanges。我想做的就是在保存完成后收到通知(即事件 SavedChanges),这样我就可以使我的缓存失效。

【问题讨论】:

  • 如果没有异常,则提交了这些更改。
  • 我没有调用 SaveChanges()。有一堆可能的 SaveChanges() 调用者,所以不是去所有的调用者(如果可能的话)并编辑它们,所以我可以在 SaveChanges() 之后被调用,我希望我能在 DbContext 中捕获它。
  • 您不能连接到活动 SavingChanges 吗? msdn.microsoft.com/en-us/library/…
  • 在数据提交之前触发。

标签: entity-framework-4


【解决方案1】:

没有内置事件来处理此问题,但您可以在派生上下文中覆盖 SaveChanges 方法,并在调用 base.SaveChanges 后触发任何特定于您自己的上下文类型的自定义事件。

【讨论】:

  • 这对 DbContext 来说是正确的,但在 DynamicData 中调用了我无法控制的 ObjectContext.SaveChanges()(因此问题标题中的 ObjectContext 请求)。
  • 您也可以为ObjectContext 覆盖SaveChanges(SaveOptions),动态数据接受您派生的ObjectContext,所以我看不出有什么区别。
  • 我看不到如何覆盖 ObjectContext 中的任何内容。我在代码中首先是 DbContext,我可以访问 ObjectContext 的唯一方法是通过 ((IObjectContextAdapter)this).ObjectContext.
  • 您的问题是什么?你一直在从一个话题跳到另一个话题。您询问了ObjectContext,您评论说我的答案仅适用于DbContext,并且您正在使用带有ObjectContext 的动态数据,现在您正在抱怨DbContext。获得答案的第一步是描述问题的能力——我们看不到你的代码,也不知道你想做什么。甚至您的问题标签也无法描述您正在使用的技术。
  • 没错,我现在意识到它有点模糊。我可能应该将答案标记为已接受并添加一个新问题。我拥有的是代码优先的 DbContext。这被输入到动态数据中,正如我发现的那样,它使用 DbContext 的内部 ObjectContext(在转换为 IObjectContextAdapter 时我可以访问它)。不调用 dbcontext 的 SaveChanges,而是使用 objectcontext 的 SaveChanges。我想做的就是在保存完成后收到通知(即事件 SavedChanges),这样我就可以使我的缓存失效。告诉我是否应该发布另一个问题。
【解决方案2】:

请原谅,但我在答案中找不到解决方案。

让我根据我的理解(和我的情况)重新表述这个问题:

我使用的是动态数据,它只接受 ObjectContext 作为配置;如果您使用 DbContext(这是使用 Code First 的方式),那么您将必须传递属性“IObjectContextAdapater.ObjectContext”,如下所示:

DefaultModel.RegisterContext(() => { return ((IObjectContextAdapter) new MyDbContext()).ObjectContext; }, new ContextConfiguration() { ScaffoldAllTables = true });

这里的问题是,当你保存更改时,MyDbContext 的 SaveChanges 方法没有被调用,而是 Dynamic Data 调用 MyDbContext.ObjectContext 中的 SaveChanges 方法。 因此,在这种情况下,覆盖 MyDbContext 中的 SaveChanges 是没有用的。

我们如何访问 ObjectContext 属性中的 SaveChanges 并更改行为以便编写自定义代码?

但无论如何,我发现正确的解决方案是在“rene”对上述问题的评论中,即在 ObjectContext 属性中添加 SavingChanges EVENT 的事件处理程序,这里又是链接:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.savingchanges.aspx

我希望这可以清除它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2023-03-07
    • 2013-11-26
    相关资源
    最近更新 更多