实体框架未将更改保存到数据库中

Kev*_*uez 5 c# mysql entity-framework entity-framework-6

我很困惑为什么这段代码不起作用,它应该在循环后保存对数据库的更改,但是当我将该方法放在循环SaveChanges内时,它会将记录保存到数据库中,但在外面不保存任何内容?大概只有300~1000条记录

    static bool lisReady = false;
    static bool sacclReady = false;

    static void Main(string[] args)
    {
        Logger("Starting services");
        ConnectDBLis().Wait();
        ConnectDBSaccl().Wait();
        Thread.Sleep(1000);
        if (lisReady & sacclReady){
            //start
            Logger("Services ready");
            StartExport().Wait();
        }
    }

    static async Task<bool> StartExport()
        {
            lis lisdb = new lis();
            nrlsaccl saccldb = new nrlsaccl();
            var getTestOrders = await lisdb.test_orders.ToListAsync();
            Logger("Services starting");
            foreach (var tO in getTestOrders.Where(x => x.entry_datetime.Value.Year == 2016))
            {
                foreach (var tr in tO.test_results)
                {
                    foreach (var tL in tr.test_result_logs)
                    {
                        results_availability postResults = new results_availability
                        { 
                          first_name = tO.patient_orders.patient.first_name,
                          middle_name = tO.patient_orders.patient.middle_name,
                          last_name = tO.patient_orders.patient.last_name,
                          birthdate = tO.patient_orders.patient.birthdate,
                        };
                        if (postResults.id == 0)
                        {
                            saccldb.results_availability.Add(postResults);
                        }
                        else
                        {
                            saccldb.Entry(postResults).State = EntityState.Modified;
                        }
                    }
                }
            }
            await saccldb.SaveChangesAsync();
            return true;
        }
Run Code Online (Sandbox Code Playgroud)

编辑:

所以我将记录限制为 100 条并且保存更改有效,即时 3000 条记录不起作用,有什么解决方案吗?

Eld*_*dho 0

这段代码并不能完全解决你的问题,这是对你的问题的一些考虑。

注意:这对我来说适用于添加 1200 条记录和 300 条修改

 static async Task<bool> StartExport()
    {
        using (var db = new Entities())
        {
            var appraisals = await db.Appraisals.ToListAsync();

            db.Database.CommandTimeout = 300;
            //Disabling auto detect changes enabled will bring some performance tweaks
            db.Configuration.AutoDetectChangesEnabled = false;
            foreach (var appraisal in appraisals.Where(g => g.Id > 1))
            {

                if (appraisal.Id == 10)
                {
                    appraisal.AppraisalName = "New name";
                    db.Entry(appraisal).State = EntityState.Added;
                }
                else
                {
                    appraisal.AppraisalName = "Modified name";
                    db.Entry(appraisal).State = EntityState.Modified;
                }
            }

            db.Configuration.AutoDetectChangesEnabled = true;

            if (await db.SaveChangesAsync() > 1)
                return true;
            else
                return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以用来db.Database.CommandTimeout = 300;增加连接超时。

实体框架 6 提供了AddRange()这将一次性插入项目,它将禁用AutoDetectChangesEnabled并插入实体

在您的情况下,您不想将实体标记为已修改,EF 已经很好地跟踪了它。实体框架 - 为什么显式将实体状态设置为已修改?

更改跟踪的目的是发现您已更改附加实体上的值并将其置于已修改状态。对于分离的实体(在没有更改跟踪的情况下加载的实体或在当前上下文之外创建的实体),手动设置状态非常重要。

这里我们将所有实体附加到上下文本身