Entity Framework. Обновить контекст - PullRequest
0 голосов
/ 03 мая 2019

Я новичок в C #. Пожалуйста, помогите мне, в каком направлении идти. У меня есть консольное приложение, которое вносит изменения в мою базу данных. Я хочу сделать веб-сервис для отображения информации. У меня есть ссылка на DB от EntityFrameworkCore, для потоковой передачи данных я выбрал SignalR. В моем веб-приложении отображается информация, но при внесении изменений я должен обновить страницу для перезагрузки контекста базы данных EF и загрузки обновленных данных из БД.

После долгих поисков в интернете я понимаю, что должен использовать динамический контекст для моей ситуации. Но как реализовать это в EFCore? Я в замешательстве. Есть простое решение этой проблемы или хороший ресурс для изучения динамического контекста. Я буду благодарен вам за любую помощь.

мой хаб

public class StreamHub : Hub
    {
        private readonly LContext _context; // conn to Database

        public ChatHub(LContext _context)
        {
            this._context = _context;
        }

        public ChannelReader<string> DelayCounter(int delay) //that method I indicate in js-client

        {
            var channel = Channel.CreateUnbounded<string>();

            _ = WriteItems(channel.Writer, 200, delay);

            return channel.Reader;
        }

        private async Task WriteItems(ChannelWriter<string> writer, int count, int delay)
        {

            for (; ; ) //endless cycle
            {

                string LL = _context.Logs.OrderByDescending(s => s.OccurTime).FirstOrDefault().Flag; //that data which I want to streaming

                await writer.WriteAsync(LL);
                await Task.Delay(delay);
                await _context.Entry(LL).ReloadAsync();
                _context.Entry(LL).Reload();
            }

        }
    }

1 Ответ

0 голосов
/ 03 мая 2019

Пара вещей.DbContexts не являются поточно-ориентированными, поэтому их следует ограничивать только тем потоком, к которому они обращаются.Переменные уровня модуля были бы нет-нет.DbContexts также довольно дешевы, чтобы раскрутиться после того, как первый разовый удар для разрешения их сопоставления был оплачен.(Самый первый запрос к DbContext этого типа) Раскрутите один раз, когда это необходимо, особенно для многопоточных или асинхронных операций.

string LL = _context.Logs.OrderByDescending(s => s.OccurTime).FirstOrDefault().Flag; //that data which I want to streaming

Это может быть более эффективным.Ваш код эффективно выполняет:

SELECT TOP 1 * FROM Logs ORDER BY OccurTime DESC

Лучше было бы:

string LL = context.Logs
    .OrderByDescending(s => s.OccurTime)
    .Select(s => s.Flag)
    .FirstOrDefault();

Это составляет:

SELECT TOP 1 Flag FROM Logs ORDER BY OccurTime DESC

Разница в том, что первый запрос возвращает все свойстважурнал, когда мы заботимся только о свойстве Flag.

Эти строки выглядят хорошо ...

await writer.WriteAsync(LL);
await Task.Delay(delay);

Это не имеет никакого смысла.«Флаг» не является объектом для перезагрузки, и это тот же метод, только async vs sync flavors.

await _context.Entry(LL).ReloadAsync();
_context.Entry(LL).Reload();

Я бы для начала изменил код так, чтобы он выглядел примерно так:

   private async Task WriteItems(ChannelWriter<string> writer, int count, int delay)
    {

        while (!_abort)
        {
            using(var context = new LContext())
            {
                string flag = _context.Logs
                    .OrderByDescending(s => s.OccurTime)
                    .Select(s => s.Flag)
                    .FirstOrDefault();
                await writer.WriteAsync(flag);
            }
            await Task.Delay(delay);
        }
    }

где _abort - это логически изменяемый логический элемент, с помощью которого у нас может быть код / ​​пользователь, сигнализирующий о том, что фоновая задача должна корректно завершиться.

Учитывая, что этот код будет часто выполняться, я хотел бы рассмотретьРешение, которое записывает данные в базу данных журналов, но затем также сохраняет в памяти недавний скользящий кэш записей для чего-то подобного, чтобы использовать его, когда попадание в БД каждые 200 мс добавляет к загрузке чего-то, что в реальном времени может быть не критичным.

...