实体 Framework.Refresh 上下文

Entity Framework.Refresh context

我是 C# 的初学者。请帮助我 go.I 的哪个方向有对我的数据库进行更改的控制台应用程序。我想让 Web 服务通过 EntityFrameworkCore 使用 DB 显示 information.I' link,对于在线流数据,我选择了 SignalR。我的 Web 应用程序显示信息,但是当我进行更改时,我必须刷新我的页面以重新加载 EF 数据库上下文并从数据库加载更新的数据。

经过长时间的互联网搜索,我明白我必须为我的 situation.But 使用动态上下文如何在 EFCore 中实现它?我 confused.Is 有解决此问题的简单方法或学习动态的好资源 context.I 将不胜感激。

我的中心

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();
            }

        }
    }

几件事。 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

区别在于第一次查询 returns 日志的所有属性,而我们只关心标志 属性。

这些线条看起来不错...

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

这些没有任何意义。 "flag" 不是要重新加载的实体,这些是相同的方法,只是异步与同步不同。

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 是一个可变布尔值,我们可以通过它 code/user 发出后台任务应该正常终止的信号。

鉴于此代码会 运行 频繁出现,我会考虑一种写入日志数据库的解决方案,但也会保留最近的内存中条目滚动缓存,以便像这样提取因为每 200 毫秒访问一次数据库会增加一些实时可能不重要的负载。