簡體   English   中英

實體框架不將更改保存到數據庫中

[英]Entity Framework not Saving Changes into Database

我很困惑為什么這個代碼不起作用,它應該在循環之后保存對數據庫的更改但是當我將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條記錄不起作用,任何解決方案?

此代碼無法完全解決您的問題,這是您的問題的一些考慮因素。

注意:這在添加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; 增加連接的超時。

實體框架6提供了AddRange()這將一次性插入項目,它將禁用AutoDetectChangesEnabled並插入實體

在您的情況下,您不希望將entites標記為已修改,EF已經很好地跟蹤它。 實體框架 - 為什么要明確地將實體狀態設置為已修改?

更改跟蹤的目的是找到您已更改附加實體的值並將其置於已修改狀態。 在分離的實體(加載的實體沒有更改跟蹤或在當前上下文之外創建)的情況下,手動設置狀態非常重要。

在這里,我們將所有實體附加到上下文本身

采用

saccldb.SaveChanges()

僅僅因為等待saccldb.SaveChangesAsync()的異步性質導致您的線程繼續並在保存到db完成之前退出該函數。 在您的情況下,它返回true。

我建議不要在控制台應用程序上使用任何異步操作,除非它有一個你想繼續使用的用戶界面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM