簡體   English   中英

使用Entity Framework上下文更新記錄,而無需手動設置屬性

[英]Updating a record using Entity Framework context without manually setting properties

我正在嘗試使用實體框架更新記錄,但要避免手動設置每個屬性,然后調用保存更改。 我有一個綁定到數據表單的類的實例,該數據表單會在用戶更改屬性時更新其所有屬性。 我可以看到的最好的方法是將上下文中的對象設置為等於綁定到我的數據表單的對象,但這不起作用。 我嘗試從上下文中刪除該對象,然后添加數據形式綁定的對象,但是它創建了一個全新的記錄(我期望如此,但認為值得一試來嘗試一下)。 考慮到使用數據綁定對象(具有相同pk值)替換上下文對象的事實,我假設上下文中有某種類型的標記用於檢測記錄是否為新行。

using (var scope = new TransactionScope())
        {
            try
            {
                using (var context = new CIS_DEVEntities())
                {
                    GangMemberBio bio = context.GangMemberBios.First(P => P.id == this.id);
                    bio = this; //this does not work.
                    context.SaveChanges();
                }
                //If the top code is successfully completed then the transaction will be commited
                //if not this line will be skipped and execution will be given to the catch block
                scope.Complete();
            }
            catch
            {

            }
        }

編輯想法1我當時想我可以在wpf窗口本身上創建一個上下文對象,然后將數據形式綁定到從該上下文中檢索到的gangmemberbio對象。 然后,當我調用保存更改時,無需執行其他任何操作。 我聽說在內存中有一個datacontext是不好的。或者如果我在using語句的上下文之外使用它,那只是不好嗎?

在您的編輯頁面中,首先從數據庫中加載對象,這將導致表單的字段全部被數據庫中的現有數據填充。 發布表單后,將設置數據對象模型的所有值。

DbContext在內部跟蹤每個實體的狀態,因此它知道是否添加/更新/刪除任何給定的實體。 當您Add()一個實體的背景下,即使它可能已經有一個ID,它的默認狀態是Added (可能是New ,不知道),這將導致現有的ID被忽略,一個新的記錄插入到數據庫。

您要做的是將現有實體附加到DbContext,然后讓DbContext知道將其視為現有實體,以便對其進行更新而不是插入。

你這樣做,由給定實體設置在的DbContext的EntityState來Modified (默認情況下它是New增加了的DbContext實體時)。

嘗試這樣的事情:

using (var context = new CIS_DEVEntities())
{
    context.Entry(this).State = EntityState.Modified;
    context.SaveChanges();
}

暫無
暫無

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

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