【问题标题】:EF Code First: Where can I find the SavingChanges Event?EF Code First:我在哪里可以找到 SavingChanges 事件?
【发布时间】:2011-10-22 18:28:18
【问题描述】:

好的,这可能是一个新手问题,但是我如何/在哪里可以订阅 ObjectContext.SavingChanges 事件,例如在这个 post 中提到的。

我的演示应用中只有两个相关的类:“Country”类和一个包含 EF Code First“定义”的类:

internal class TestDb : DbContext
{
    public DbSet<Country> Countries { get; set; }       
}

非常感谢任何提示。

【问题讨论】:

    标签: c# .net entity-framework entity-framework-4 entity-framework-4.1


    【解决方案1】:

    你应该可以这样做:

    internal class TestDb : DbContext  
    {  
        public void SetSavingChanges(EventHandler evt) 
        {
                var oc = this as IObjectContextAdapter;
                oc.ObjectContext.SavingChanges -= evt;
                oc.ObjectContext.SavingChanges += evt;
        }
    
        public DbSet<Country> Countries { get; set; }  
    }  
    

    【讨论】:

    • 不完全理解你的语法,但对我来说,主体似乎是最好的方法。真正的问题是是否有更好的方法使用 EF 4.1。
    • @SanderRijken - 你不明白什么语法?这很简单。 DbContext 实现了IObjectContextAdapter 接口,该接口上有一个名为 ObjectContext 的属性。您将this 转换为适配器,然后使用它的 ObjectContext 属性来设置事件。
    • (event evt)。我可能会将事件公开为public event EventHandler&lt;SomeEventArgsType&gt; SavingChanges { add { ((IObjectContextAdapter)this).ObjectContext.SavingChanges += value; } remove { ((IObjectContextAdapater)this).ObjectContext.SavingChanges -= value; } }
    • @SanderRijken - 这也是一种可能性,可以通过多种方式完成。这一切都取决于你的喜好。不过,您确实应该在 add 方法中删除并添加该事件,这样该事件就不会被添加两次。
    • @MystereMan 在 TestDb 的构造函数中调用这个“SetSavingChanges”方法是否安全?
    【解决方案2】:

    从我在 MSDN 上看到的内容来看,DbContextObjectContext 的实例包装为外观,而不是暴露此特定事件。

    但是,DbContext 确实有一个 constructor overload 接受 ObjectContext - 您可以使用它来传递 ObjectContext 并订阅 SavingChanges 事件。

    using(ObjectContext context = new ObjectContext(myConnectionString))
    {
      using(DbContext dbContext = new DbContext(context, true))
      {
    
      }
    }
    

    【讨论】:

      【解决方案3】:

      另一种方式可能是,例如:

      Public Class MainForm
      
        Private WithEvents myObjectContext As ObjectContext
        Private myDbContext As DbContext
      
      ...
      
        Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles Me.Load
          myDbContext = New DbContext
          myObjectContext = CType(myDbContext, IObjectContextAdapter).ObjectContext
      
      ...
      
      
        Private Sub ObjectContextSavingChanges(sender As Object, e As EventArgs) Handles myObjectContext.SavingChanges
      
          'Your code hear
      
        End Sub
      

      【讨论】:

        猜你喜欢
        • 2011-07-22
        • 1970-01-01
        • 2018-08-08
        • 2011-08-27
        • 2018-10-07
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多