【问题标题】:Using SignalR with Entity Framework to poll the database使用带有实体框架的 SignalR 轮询数据库
【发布时间】:2018-04-13 14:50:27
【问题描述】:

我正在尝试在 .NET MVC5 应用程序中实现 SignalR。我正在使用 EF 6.0.0 和 SignalR 2.2.3。每当数据库发生一些变化(更新、插入、删除)时,我都想更新客户端屏幕。我四处搜索,发现一些文章展示了如何设置 SignalR 以发送实时消息(如聊天),然后有一些文章展示了如何使用 ADO.NET 而不是 EF 来做我想做的事情。 Here's 我发现的一篇文章使用 ADO.NET 来实现相同的目标。除了 EF,我能做些什么来实现同样的事情?下面是文章中处理 ADO.NET 部分的代码 sn-p:

public class JobInfoRepository {

public IEnumerable<JobInfo> GetData()
{

    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand(@"SELECT [JobID],[Name],[LastExecutionDate],[Status]
           FROM [dbo].[JobInfo]", connection))
        {
            // Make sure the command object does not already have
            // a notification object associated with it.
            command.Notification = null;

            SqlDependency dependency = new SqlDependency(command);
            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

            if (connection.State == ConnectionState.Closed)
                connection.Open();

            using (var reader = command.ExecuteReader())
                return reader.Cast<IDataRecord>()
                    .Select(x => new JobInfo(){ 
                        JobID = x.GetInt32(0), 
                        Name = x.GetString(1), 
                        LastExecutionDate = x.GetDateTime(2),  
                        Status  = x.GetString(3) }).ToList();                            
        }
    }        
}

我也阅读了文章中的 cmets,有人说dependency_OnChange 方法正在连续触发。难道不应该只在我们更改数据库中的某些内容时才触发它吗?如果要连续触发,我们还不如使用简单的ajax轮询,每秒轮询db,对吧?

我可以查看另一篇使用 SignalR 解释 EF 的文章吗?谢谢

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-5 signalr


    【解决方案1】:

    经过一番研究,我发现配置集线器时不能使用EF代替ADO.NET:

    using (SqlCommand command = new SqlCommand(@"SELECT [JobID],[Name],[LastExecutionDate],[Status]
           FROM [dbo].[JobInfo]", connection))
    

    因为它使用SqlCommand 而不是任何lamba 表达式。

    【讨论】:

    • 什么,你想做什么?当您的数据库更新中的某些内容时发送更新?如果只有 1 个应用程序插入您的数据库,您应该在有人发送请求时发布一条消息,轮询您的数据库非常费力
    • 我没有轮询数据库,而是在数据库发生任何变化时使用 SignalR 集线器向客户端发送更新。很抱歉给您添麻烦了,应该没有在标题中写投票。我之前使用 Ajax 来轮询数据库,但正如你所说,它对数据库非常重,所以我决定使用 SignalR。
    • 为什么不让您的网络服务在需要更新时调用集线器?
    • 因为我不知道什么时候会发生变化。所以我必须使用SqlDependency 来了解更改并通知客户。
    • Web 服务不是首先更新数据库的东西吗?如果网络服务是唯一更新数据库的东西,你可以让网络服务直接调用集线器
    猜你喜欢
    • 2018-05-13
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多