【问题标题】:Entity Framework listening to SQL Server changes实体框架侦听 SQL Server 更改
【发布时间】:2013-07-10 18:08:36
【问题描述】:

我正在处理以下场景:

我有一个控制台,它用一些数据填充 SQL Server 数据库。我还有一个 Web 应用程序可以读取相同的数据库并在前端显示数据。这两个应用程序都使用实体框架与数据库进行通信(它们具有相同的连接字符串)。

我想知道如何将数据库发生的任何更改通知 Web 应用程序。请记住,无论如何都没有引用这两个应用程序。

是否有 EF 提供的事件在某些发生更改时触发。本质上,我想知道什么时候发生了变化,以及变化的性质

【问题讨论】:

    标签: asp.net sql-server entity-framework c#-4.0 asp.net-web-api


    【解决方案1】:

    我有类似的需求,我使用 EF 函数解决了它:

    [context].Database.CompatibleWithModel(throwIfNoMetadata: true)
    

    如果您的模型使用元数据表匹配底层数据库结构,它将返回。

    请注意,我使用的是 Code First 方法。

    msdn定义如下:

    http://msdn.microsoft.com/en-us/library/system.data.entity.database.compatiblewithmodel(v=vs.103).aspx

    编辑:

    刚刚发现一篇带有演示的精彩文章:

    http://blog.oneunicorn.com/2011/04/08/code-first-what-is-that-edmmetadata-table/

    【讨论】:

    • 哦,这太完美了。非常感谢。但是,您将如何定位实际变化。例如,您能否达到特定表(甚至记录)更改的粒度。
    • 我很确定你可以,但是每当我发现一个不兼容的模型时,我都会重新创建数据库或我的实体模型。所以我真的不知道你怎么能看到变化本身。
    • 如果我错了就更正,但我认为如果模型的结构发生了变化(例如添加了属性)而不是实际值,这个 CompatibleWithModel 将返回 false。
    • 对不起,但对我来说,当您指的是数据库更改时,您正在谈论架构;/。查看 data 是否已更改的最佳解决方案是在您的应用程序中托管 WCF 服务并使用控制台应用程序调用它。
    • 对不起,我应该说得更清楚。非常感谢,我会尽量听从你的建议。好吧,事实上,我希望这是一个更容易的任务。但以防万一,谢谢你的信息。
    【解决方案2】:

    这根本与 EF 无关。 EF 只是一个进行 SQL 调用并将它们映射到对象的库。它没有数据库的内部知识。因此,当一个应用程序中的数据发生更改时,另一个应用程序不知道,除非他们查询以查看该数据是否更改(而且您不会不断地运行查询来知道这一点,这太不切实际了)。

    可能有一些方法可以做到这一点,例如向数据库添加触发器,然后调用扩展存储的过程来向应用程序发送消息,但这需要做很多工作,并且可能会妥协数据库的健壮性。

    曾经有一种叫做通知服务的东西,但它已被弃用。现在有一种称为 SqlDependency 对象的东西,它在某些情况下可能会对您有所帮助.. 但这完全取决于您要做什么。

    无论如何,找到不同的方式来做你想做的事通常会更容易。这是一个复杂的话题,确实需要大量的 sql server 知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多