2016-12-28 130 views
2

如果我有更新條目的代碼,並且更新只更改了兩列,其餘的條目在輸入大概十列的數據後保持不變,那麼它是保存所有十列還是隻保存兩個更改?實體框架保存全部​​,還是僅保存更改?

如果我更新了10列,但沒有更改每一個,它是否打擾做更新?

col1 | col2 | col3 
-----|------|----- 
1 |2  |3 

更新COL1至1,COL2至2,COL3〜4的作用是保存所有的三個或僅COL3,因爲它是唯一改變的一個?

如果我將col1更新爲1,col2更改爲2,col3更改爲3,則沒有任何更改,因此它仍會更新?

在那個筆記上,我怎麼看到SaveChanges生成的SQL?

+0

請參閱[這個答案](http://stackoverflow.com/questions/1412863/how-do-i-view-the-sql-generated-by-the-entity-framework/20751723#20751723)關於如何查看EF生成的SQL –

+0

這取決於您如何使用EF。如果您正在修改的實體已連接,則它只會更新已更改的列。如果未保存,並且在保存之前未檢索當前值,則將更新除主鍵以外的所有列。 – jrummell

回答

0

有人貼出了答案,但刪除它之前,我可以添加評論。所以這裏是他們的答案加我自己的答案。

是的,簡而言之,它只會更新更改的列。這假定你正在使用上下文(不完全確定這是什麼意思)

爲了測試這個,我使用了Trace中的日誌。

Using DB As New wotcDB 
    DB.Database.Log = Sub(val) Diagnostics.Trace.WriteLine(val) 

    Dim Update = (From t In DB.interview_income 
        Where t.ID = IncomeID).First 
    Update.Company = If(String.IsNullOrEmpty(txtCompany.Text), Nothing, txtCompany.Text) 
    Update.StartDate = If(IsNothing(txtStartDate.DateValue), Nothing, txtStartDate.DateValue) 
    Update.EndDate = If(IsNothing(txtEndDate.DateValue), Nothing, txtEndDate.DateValue) 
    Update.HWM = If(String.IsNullOrEmpty(cboHWT.Text), Nothing, cboHWT.Text) 
    Update.Wage = txtWage.DecimalValue 
    Update.Units = If(String.IsNullOrEmpty(txtHourPerWeek.Text), Nothing, CDec(txtHourPerWeek.Text)) 
    Update.Adj = txtAdj.DecimalValue 
    Update.Total = txtTotal.DecimalValue 
    DB.SaveChanges() 
End Using 

DB.Database.Log = Sub(val) Diagnostics.Trace.WriteLine(val) 

寫出所有生成的SQL的跟蹤。當我做了一個沒有任何值更改的更新時,它沒有打擾生成更新聲明。當我更改一列時,它會生成一個只有該列和密鑰的更新。

所以,兩個答案中的一個。使用該數據庫日誌查看您生成的SQL,並且只在需要時更新。

0

您可以看到使用SQL事件探查器由EF生成的SQL代碼(在MySQL的SQL Server或其它的工具)