我的问题是当我在我的上下文中执行 CRUD 操作时,我的组件中没有进行更改。
DbContext 注册如下:
services.AddDbContextFactory<DBContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("my_ConnectionStrings")),
lifetime: ServiceLifetime.Transient);
在上面的代码中,我配置ServiceLifetime
为Transient
. 因此,每次请求时都必须创建该服务的新实例。
这是我的代码:
[Inject] IDbContextFactory<DBContext> DbFactory;
private string updateMessage(int messageID)
{
DBContext _context = DbFactory.CreateDbContext();
var result = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
if (result != null)
{
result.LastUpdate= DateTime.Now.ToString("HH:mm:ss");
_context.SaveChanges();
}
var assert = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
return "Last update is: " + assert.LastUpdate;
}
在上面的代码中,我将工厂注入到我的组件中并创建了新实例。但是我的组件中没有考虑上下文更改。我想观察组件中的上下文变化。
在上面的代码中,我修改了上下文,但没有任何变化,该方法返回LastUpdate
.
在 Blazor Server 中,范围服务注册可能会出现问题,因为实例在用户电路中的组件之间共享。DbContext 不是线程安全的,也不是为并发使用而设计的。现有的生命周期是不合适的。有关详细信息,请参阅带有 Entity Framework Core 的 ASP.NET Core Blazor 服务器。
您应该创建一个新的 DbContext 实例。创建新 DbContext 实例的一种方法是 usingusing
语句。
试试这个代码:
[Inject] IDbContextFactory<DBContext> DbFactory;
private string updateMessage(int messageID)
{
using (DBContext _context = DbFactory.CreateDbContext())
{
var result = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
if (result != null)
{
result.LastUpdate= DateTime.Now.ToString("HH:mm:ss");
_context.SaveChanges();
}
}
var assert = new Messages();
using (DBContext _context = DbFactory.CreateDbContext())
{
assert = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
}
return "Last update is: " + assert.LastUpdate;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句