【问题标题】:SignalR SqlDependency breaks when I make SqlCommand generic当我使 SqlCommand 通用时,SignalR SqlDependency 中断
【发布时间】:2018-04-25 13:17:55
【问题描述】:

我正在使用 SignalR 接收对数据库所做的更新。我试图使我的方法通用,如下所示,但是,这会破坏 SQL 依赖关系,因为当数据库发生变化时它不会触发。我已将问题的根源缩小到似乎阻止它工作的 SQL 命令。

public IEnumerable<T> GetAllMessages<T>() where T : new()
    {
        var messages = new List<T>();
        using (var connection = new SqlConnection(_connString))
        {
            connection.Open();
            using (var command = new SqlCommand(@"SELECT * FROM [dbo]." + typeof(T).Name, connection))
            {
                command.Notification = null;

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

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

                var reader = command.ExecuteReader();

                while (reader.Read())
                {
                    var row = new T();
                    ConvertReaderToRelevantModel(reader, row);
                    messages.Add(row);
                }
            }
        }

        return messages;
    }

如果我将 SQL 命令更改为下面的 sn-p,它会按预期工作:

using (var command = new SqlCommand(@"SELECT [ID], 
            [Name], [Number], [DateLastUpdated] FROM [dbo].[HeartBeats]", connection))

是什么阻止了它的工作,我该如何解决这个问题?

【问题讨论】:

    标签: c# sql asp.net-mvc signalr


    【解决方案1】:

    typef(T).Name 不是您所期望的。打个断点看看。

    【讨论】:

    • 这实际上正是我所期望的。我正在使用代码优先迁移,因此我的模型类型有一个同名的匹配表。
    • 你没有命名空间吗?
    • 还有,它是复数吗?在您的示例中,表名是复数,您的类名可能不是。
    • 名称匹配,并且该命令在拉回数据时首次运行。问题是它不再起作用,如果数据库发生变化,SqlDependency 不会触发
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多