2016-12-28 81 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或其它的工具)