2011-12-31 56 views
5

有没有一种很好的方法来检测ObjectContext更改实际提交时的情况?实体框架4:ObjectContext事件成功保存

SavingChanges发生在去数据存储之前,但我也需要一种方法来知道如果这些更改实际承诺。

在此先感谢 约翰

更新:

我所拥有的是一个代码第一的DbContext。这被馈入到动态数据中,我发现它使用了DbContext的内部ObjectContext(当我将其转换为IObjectContextAdapter时,我可以访问它)。不调用dbcontext的SaveChanges,而是使用objectcontext的SaveChanges。我想要做的就是在保存完成后通知(即事件SavedChanges),这样我可以使缓存失效。

+0

如果没有异常提交这些更改。 – 2011-12-31 12:55:29

+0

我没有调用SaveChanges()。有一堆可能的SaveChanges()调用者,所以不要去所有这些(如果甚至可能的话)并编辑它们,以便我可以在SaveChanges()后调用。我希望能在DbContext中捕获它。 – John 2011-12-31 13:00:56

+0

您不能连接到事件SavingChanges吗? http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.savingchanges.aspx – rene 2011-12-31 13:09:01

回答

7

没有内置的事件来处理这一点,但你可以在你的导出场境覆盖SaveChanges方法,你叫base.SaveChanges后触发特定的任何自定义事件,以自己的上下文类型。

+0

对于DbContext是这样的,但在DynamicData中,ObjectContext.SaveChanges()被调用,我无法控制它(因此在问题的标题中为ObjectContext请求)。 – John 2011-12-31 17:53:37

+0

您也可以重写ObjectContext的SaveChanges(SaveOptions),动态数据接受派生的ObjectContext,所以我没有看到区别。 – 2011-12-31 20:43:15

+0

我会研究一下。 – John 2011-12-31 20:57:27

0

对不起,但我在答案中找不到解决方案。

让我按照我的理解(和我的情况)改写了这个问题:

我使用的动态数据,只接受的ObjectContext的配置;如果你使用的DbContext(这是去与代码优先的方式),那么你将不得不通过属性“IObjectContextAdapater.ObjectContext”这样的:

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

这里的问题是,当你保存的变化,不调用MyDbContext的SaveChanges方法,而是调用MyDbContext.ObjectContext中的SaveChanges方法。 因此,在这种情况下,重写SaveChanges在MyDbContext中是无用的。

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

但无论如何,我找到正确的解决方案是由“雷”到上面的问题,这将在ObjectContext的财产SavingChanges事件的事件处理程序的注释,这里又是链接:

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

我希望能够清除它