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

Posted

技术标签:

【中文标题】实体框架未将更改保存到数据库中【英文标题】:Entity Framework not Saving Changes into Database 【发布时间】:2016-08-11 00:00:57 【问题描述】:

我很困惑为什么这段代码不起作用,它应该在循环之后保存对数据库的更改,但是当我将 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;
        

编辑:

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

【问题讨论】:

savechangesasync 时是否有任何错误。我已经在本地复制了上面的代码,对我来说似乎工作正常 @Eldho 我没有收到任何错误,我在 savechanges 上设置了一个断点,你能告诉我你的代码吗? 我可以在哪里发布我的代码 @Eldho 你可以在 pastebin 发帖 pastebin.com/SBaepLVT 请看代码 【参考方案1】:

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

注意:添加 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;
        
    

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

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

在您的情况下,您不想将实体标记为已修改,EF 已经很好地跟踪它。 Entity Framework - Why explicitly set entity state to modified?

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

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

【讨论】:

我怀疑还有其他问题。使用 ef 及以上代码我能够插入 3000 条记录。使用 SaveChanges 而不是 Aync 并查找其抛出的错误【参考方案2】:

使用

saccldb.SaveChanges()

仅仅是因为 await saccldb.SaveChangesAsync() 的异步性质导致您的线程在保存到数据库完成之前继续并退出该函数。在您的情况下,它返回 true。

我建议不要在控制台应用程序上使用任何异步操作,除非它具有您想要继续使用的用户界面。

【讨论】:

以上是关于实体框架未将更改保存到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 6 不保存更改

无法使用实体框架保存数据库更改

实体框架 ChangeTracker 流并保存到查询

实体框架不保存更改

实体框架中与代码优先外键的更改冲突

使用实体框架6插入已断开的相关实体