【问题标题】:C# Entity Framework fire event when db changed by external source当外部源更改数据库时 C# Entity Framework 触发事件
【发布时间】:2015-02-13 15:21:43
【问题描述】:

我正在编写一个软件,它将充当一些仓库管理软件和自动车辆硬件之间的中间人。我的程序有一个位于服务器上的数据库实体模型。

我们使用的车辆硬件带有一些允许它读取和写入数据库的软件。

我想在我的实体模型中设置在特定字段更新时触发的事件。

例如:车辆可能会遇到错误,然后它将一些值写入数据库中的表。然后我的程序需要识别这种变化并通知 WM 软件。

此解决方案需要事件驱动,因为我不能牺牲 CPU 来不断轮询数据库以进行更改

通过覆盖实体的 SaveChanges() 方法,我已经看到了许多解决方案,但是在我看来,只有当更改来自应用程序本身而不是来自外部源时才会起作用。

这可能吗? EF 有这个内置的,我只是没有看到它?

当物理 DB 更新时,EF 会调用 saveChanges() 吗?

非常感谢

【问题讨论】:

  • 我不确定这样的事情是否可能发生。将一些代码直接添加到您的数据库中可能是合理的:msdn.microsoft.com/en-us/library/ms254498(v=vs.110).aspx。此代码可以使用一些系统事件、.net 远程处理或其他东西来将“事件”传递给您的软件。据我所知,SQL Server 支持通知,但仅适用于 DDL。
  • 我的软件是一个dll...
  • 如果你可以从数据库触发器调用你的 DLL - 你有解决方案。我说的对吗?
  • SQL Server Broker 和 .net 的 SqlDependancy 类将为您提供帮助。

标签: c# events .net-4.5 entity-framework-6


【解决方案1】:

为了在 .NET 中构建消息驱动的应用程序,您需要使用某种 ESB(企业服务总线)架构。有许多技术可以与 .NET 一起使用,但 Entity Framework 在这里还不够。查看:支持消息传递的 Rabbit MQ、Azure ESB、BizTalk 或类似技术。基本上,当数据发生变化时需要触发一条消息。

【讨论】:

    【解决方案2】:

    基于this answersimilar question,至少直接在实体框架中,答案似乎是否定的。正如@zaitsman 在评论中提到的,您也许可以使用 SqlDependancy 类。 documentation 有这个例子可能会有所帮助:

    void SomeMethod()
    {
        // Assume connection is an open SqlConnection.
    
        // Create a new SqlCommand object.
        using (SqlCommand command=new SqlCommand(
            "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers",
            connection))
        {
    
            // Create a dependency and associate it with the SqlCommand.
            SqlDependency dependency=new SqlDependency(command);
            // Maintain the reference in a class member.
    
            // Subscribe to the SqlDependency event.
            dependency.OnChange+=new
               OnChangeEventHandler(OnDependencyChange);
    
            // Execute the command.
            using (SqlDataReader reader = command.ExecuteReader())
            {
                // Process the DataReader.
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2013-11-16
      • 1970-01-01
      • 2018-07-25
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多