Some one posted an answer but removed it before I could add a comment. So here is their answer plus my own.
Yes, in short it only updates the columns that change. This assumes that you are using context (not fully sure what that means)
To test this I used a log in 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
The line
DB.Database.Log = Sub(val) Diagnostics.Trace.WriteLine(val)
Writes all generated SQL to the trace. When I did a update where none of the values changed, it didn't bother generating an update statement. When I changed one column it generated an update that only had that column and key.
So, two answers in one. Use that Database log to see your generated SQL, and yes it only updates when it needs to.