Мне нужно уведомить веб-пользователя об изменении базы данных.
Я использую это для регистрации события:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")]
void RegisterForNotifications()
{
string connectionString = "";
using (Repositories.GestionActivosEntities db = new Repositories.GestionActivosEntities())
connectionString = db.Database.Connection.ConnectionString;
connectionString = "Data Source=localhost;Initial Catalog=MyDatabase;Persist Security Info=True;Integrated Security=SSPI;MultipleActiveResultSets=true;Pooling=False;";
string sqlQuery = @"SELECT [AlertaId]
,[PadreId]
,[UsuarioOrigenId]
,[UsuarioDestinoId]
,[AlertaOrigen]
,[AlertaNombre]
,[AlertaMensaje]
,[AlertaMotivo]
,[AlertaCreadoEn]
,[AlertaEnviadoMail]
,[AlertaLeidoPortal]
FROM [dbo].[Alerta]";
using (var sqlConnection = new SqlConnection(connectionString))
using (var sqlCommand = new SqlCommand(sqlQuery, sqlConnection))
{
sqlCommand.Notification = null;
var sqlDependency = new SqlDependency(sqlCommand);
sqlDependency.OnChange += OnSqlDependencyChange;
if (sqlConnection.State == ConnectionState.Closed)
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
}
}
void OnSqlDependencyChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
SqlNotification?.Invoke(sender, e);
RegisterForNotifications();
}
}
При отладке этот код выполняется правильно, однакоКогда я изменяю данные в этой таблице, OnSqlDependencyChange не вызывается.
С другой стороны, у меня есть учебник на этой странице: https://www.codeproject.com/Tips/1075852/ASP-NET-MVC-SignalR-SqlDependency-and-EntityFramew?msg=5672753#xx5672753xx
Код, который я использую, тот жекак учебник. Разница в том, что я жестко запрограммировал запрос и строку подключения.
Один факт привлек мое внимание.
В моем коде, когда sqlCommand.ExecuteNonQuery ();Инструкция вызывается, сразу же вызывается событие OnSqlDependencyChange с типом «Подписаться». Однако в коде учебника это событие вызывается только тогда, когда в таблице есть изменения. В этом случае событие вызывается с типом «Изменить».
В базе данных включен брокер.
Что может происходить? Спасибо