Entity Framework Core 3 Sql Зависимость - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть архитектура: некоторые сервисы веб-API вставляют данные в SQL таблицы базы данных. А некоторые windows сервисы подписываются на эту таблицу вставки события и выполняют некоторую работу. В. Net Framework Я использую sql зависимость для подписки.

На данный момент у меня есть задача перенести все проекты в ядро. Net. Для веб-API нет вопросов, для сервисов windows я могу использовать шаблон проекта WorkerService. Вопрос в том, как использовать sql зависимость.

In. Net Framework Я использую класс уведомлений

 public class EntityChangeNotifier<TEntity> : IDisposable where TEntity : class
{
    private DbContext _context;
    private Expression<Func<TEntity, bool>> _query;
    private string _connectionString;

    public EntityChangeNotifier(Expression<Func<TEntity, bool>> query = null)
    {
        _context = new MyDbContext();
        _query = query;
        _connectionString = _context.Database.Connection.ConnectionString;

        SqlDependency.Start(_connectionString);
        RegisterNotification();
    }
    public event EventHandler<EntityChangeEventArgs<TEntity>> Changed;
    public event EventHandler<NotifierErrorEventArgs> Error;

    private void RegisterNotification()
    {
        _context = new GoodWillDbContext();

        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            using (SqlCommand command = GetCommand())
            {
                command.Connection = connection;
                connection.Open();

                var sqlDependency = new SqlDependency(command);
                sqlDependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
                using (SqlDataReader reader = command.ExecuteReader())
                {
                }
            }
        }
    }

    private DbQuery<TEntity> GetCurrent()
    {
        IQueryable<TEntity> query = _context.Set<TEntity>();
        if (_query != null)
            return query.Where(_query) as DbQuery<TEntity>;
        return query as DbQuery<TEntity>;
    }

    private SqlCommand GetCommand()
    {
        var query = GetCurrent();
        SqlCommand command = new SqlCommand()
        {
            CommandText = query.ToString()
        };
        return command;
    }

    protected virtual void OnChanged(EntityChangeEventArgs<TEntity> e)
    {
        Changed?.Invoke(this, e);
    }

    protected virtual void OnError(NotifierErrorEventArgs e)
    {
        Error?.Invoke(this, e);
    }

    private void OnDependencyChange(object sender, SqlNotificationEventArgs e)
    {
        // Handle dependency change event
        // OnChange or OnError event
    }

    public void Dispose()
    {
        // stop
    }

Но в. Net он выдает ошибки, например, GetCurrent всегда значение NULL. Я понимаю, что невозможно использовать класс для. net framework для. net core. Есть ли способ заставить его работать или лучше подписаться на изменения базы данных.

...