实体 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 毫秒访问一次数据库会增加一些实时可能不重要的负载。
我是 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 毫秒访问一次数据库会增加一些实时可能不重要的负载。