检测特定条件数据库更改

时间:2017-08-22 06:16:15

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

我正在使用ASP.NET MVC 5和SQL Server 2016在我的应用程序中进行简单的聊天。 在数据库中得到以下表格:

[dbo].[UserMessages](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserIdSender] [int] NOT NULL,
[UserIdReciever] [int] NOT NULL,
[DateSent] [datetime] NOT NULL,
[MessageText] [nvarchar](max) NULL,
[IsRead] [int] NOT NULL

因此,当一个用户向另一个用户[UserIdReciever]发送消息[UserIdSender]时,第二个用户会在打开聊天选项卡时看到它,因为以下对db的请求将会完成:

public IQueryable<UserMessages> GetDialogByUserIds(int senderId, int recieverId)
    {
        return _msgRepo.GetAllQueryable(m => (m.UserIdSender == senderId && m.UserIdReciever == recieverId) ||
                                             (m.UserIdSender == recieverId && m.UserIdReciever == senderId));
    }

问题是要保持实时聊天,所以当第二个用户首先回答时,第一个用户会立即看到它。所以,我正在考虑是否有办法在更改特定表时在sql中创建特定事件 在sql:

中有类似的东西
if(UserMessages.IsChanged())
{
     event UserMessagesChanged();
}

或者有没有更好的方法来通知用户传入的消息,每次数据库都不会发送请求,因为有很多用户,每次用户发送消息时都会触发此事件?

2 个答案:

答案 0 :(得分:1)

如果您在本地使用SqlServer,您可以尝试使用SqlDependency检测UserMessages表中的更改并在.NET上触发事件来管理聊天更新并将数据推送到浏览器端(使用SocketIO等框架)或SignalR来管理服务器 - 浏览器通信)。 Biblio:

Detecting Changes with SqlDependency

Socket IO

Learn About ASP.NET SignalR

如果您正在使用基于云的体系结构,则需要重新考虑应用程序分层并使用适当的框架(例如,对于Azure,SqlDependency不可用,并且用于检测您可能选择实施的数据更改使用Azure Service Bus发布 - 订阅模式

答案 1 :(得分:0)

在您的情况下,解决它的最佳方法是使用SignalR库。了解什么是Hub以及它是如何工作的。然后将这些行放在您的集线器类中:

public class YourHub : Hub {
      public void MessageSender(int userId, string message)
        {
        //here you need to get the unique connectionId of a user
        //just make a query to the database for this
        Clients.Client(user.ConnectionId).sendMessage(message)

        }
}

然后在客户端:

 var hub = $.connection.yourHub;
        // Start Hub
  $.connection.hub.start().done(function () {
        hub.client.sendMessage = function(message){
//here you just append the message for the user
}});