Entity framework core 实体核心和保存更改只工作一次
我对Entity Core 3.1.2有问题 我有这样的代码:Entity framework core 实体核心和保存更改只工作一次,entity-framework-core,Entity Framework Core,我对Entity Core 3.1.2有问题 我有这样的代码: SQL.Database.EnsureCreated(); var ThisCollector = SQL.CollectorServers .Where(esa => esa.ServerName == ServerCollectorName) .FirstOrDefault(); while (foo) { await S
SQL.Database.EnsureCreated();
var ThisCollector = SQL.CollectorServers
.Where(esa => esa.ServerName == ServerCollectorName)
.FirstOrDefault();
while (foo)
{
await SQL.Entry(ThisCollector)
.ReloadAsync();
DateTime dtTimeOut = DateTime.UtcNow.AddMinutes(-1);
//check status of current Worker
var CurrentLB = SQL.CollectorServers
.Where(esa => esa.isWorker == true
&& esa.LastSeenLB < dtTimeOut)
.FirstOrDefault();
if (CurrentLB!=null) //Current Worker is dead!
{
CurrentLB.isWorker = false;
ThisCollector.isWorker = true;
SQL.SaveChanges(); //This works allways
}
var Collectors = SQL.CollectorServers
.Where(Esa => Esa.isWorker == true);
if (Collectors.Count() == 0)
{
ThisCollector.isWorker = true;
SQL.SaveChanges();
}
if (Collectors.Count() >= 2)
{
foreach(CollectorServer cs in Collectors)
{
cs.isWorker = false;
//why this is requied?
SQL.Entry(cs).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
}
ThisCollector.isWorker = true;
//<--This works only once, without manually setting State to
// modified!!! Why? Values has been changed from external program.
//(Management studio in this case)
SQL.SaveChanges();
}
await Task.Delay(10000, stoppingToken);
}
SQL.Database.recreated();
var thiscoller=SQL.CollectorServers
.Where(esa=>esa.ServerName==ServerCollectorName)
.FirstOrDefault();
while(foo)
{
等待SQL.Entry(ThisCollector)
.ReloadAsync();
DateTime dtTimeOut=DateTime.UtcNow.AddMinutes(-1);
//检查当前工作人员的状态
var CurrentLB=SQL.collectorserver
.Where(esa=>esa.isWorker==true
&&esa.LastSeenLBEsa.isWorker==true);
if(Collectors.Count()==0)
{
ThisCollector.isWorker=true;
SaveChanges();
}
if(Collectors.Count()>=2)
{
foreach(收集器中的收集器服务器cs)
{
cs.isWorker=false;
//为什么需要这样做?
SQL.Entry(cs.State=Microsoft.EntityFrameworkCore.EntityState.Modified;
}
ThisCollector.isWorker=true;
// 如果未跟踪收集器服务器
返回的实体,则所描述的行为是有意义的
thiscolector
通过调用SQL.Entry(thiscolector)
附加到每个循环上:
对它所做的任何更改都将通过第一次调用DbContext.SaveChanges()
进行跟踪和保存
另一方面,收集器
查询返回的实体:
var Collectors = SQL.CollectorServers
.Where(Esa => Esa.isWorker == true);
将保持未跟踪状态,直到通过调用SQL.Entry(cs)
重新连接它们:
这相当于调用附加并将状态设置为Modified
。更新更容易阅读:
foreach(CollectorServer cs in Collectors)
{
cs.isWorker = false;
SQL.Update(cs);
}
SaveChanges
工作正常。但这段代码没有多大意义。DbContext是一个工作单元,不是SqlConnection的替代品。它不应该被保留(SqlConnection也不是).SaveChanges
保存UoW中的所有更改,通常在退出操作和处理DbContext
之前调用。如果不调用,则会得到“自动”不存储任何更改时回滚。SaveChanges
之后的任何新修改也会被跟踪。DBContext不是线程安全的,因为它们不打算从不同的线程使用-只有SaveChanges
写入数据库是没有意义的。其他所有内容都是内存中的操作。这段代码在做什么g到底是什么?什么是SQL
,那些Entry
调用是什么?您确实意识到collector
不是一个对象列表,而是一个查询?每次您枚举它或调用Count()
在它上面,它会再次运行。我想,通过一个或多个更新
查询,你想做什么就容易多了。像EF这样的ORM是用来将对象映射到关系表的。你这里没有对象,所以不需要ORM。是的,代码可能没有意义,很多东西都被删掉了。只剩下有问题的代码。SQL是DbContext,它只在这个线程中使用。Entry调用,对我来说在Core Entity中是新的。(MSDN“Entry提供对实体的更改跟踪信息和操作的访问。”)实际上,计数是一个很好的点,我会修复它。感谢您的回复。这澄清了很多。
foreach(CollectorServer cs in Collectors)
{
cs.isWorker = false;
SQL.Entry(cs).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
}
foreach(CollectorServer cs in Collectors)
{
cs.isWorker = false;
SQL.Update(cs);
}