Entity framework core 实体核心和保存更改只工作一次

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

我对Entity Core 3.1.2有问题

我有这样的代码:

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