2011-04-29 128 views
0

如何使用Linq to SQL來僅更新實體的某些字段?如何使用Linq to SQL更新實體的某些字段?

ASPX頁面:

Dim pdf As New Dashboard.Process_PDF() 
    pdf.ID = ID 
    pdf.Label = rtbLabel.Text 
    pdf.IsShared = cbxIsShared.Checked 
    pdf.AccountID = AccountID 

    If RadUpload1.UploadedFiles.Count > 0 Then '<-- Uploading a new file is optional in Update Form but is required for Insert (Insert works fine)' 
     Dim imageFile As UploadedFile = Nothing 
     imageFile = RadUpload1.UploadedFiles(0) 
     Dim bytes() As Byte = New Byte(imageFile.InputStream.Length - 1) {} 
     imageFile.InputStream.Read(bytes, 0, CInt(imageFile.InputStream.Length)) 
     pdf.FileName = imageFile.FileName 
     pdf.FileBytes = bytes 
     pdf.FileSize = imageFile.ContentLength 
     pdf.ContentType = imageFile.ContentType 
     pdf.UploadedBy = RUserName 
    End If 

    pdf.Update() 

Process_PDF.vb - VERSION1
如果我有這樣的(如下圖),然後什麼也沒有發生。沒有錯誤。沒有更新。

Public Sub Update() 
    dc.Process_PDFs.Attach(Me) 
    dc.SubmitChanges() 
End Sub 

Process_PDF.vb - 版本2
如果我有這樣的(如下圖),然後我得到在附加行錯誤:

實體只能附加爲沒有原始狀態,如果修改它聲明一個版本成員或沒有更新檢查策略。

Public Sub Update() 
    dc.Process_PDFs.Attach(Me,True) '<--- ERRORS OUT HERE' 
    dc.SubmitChanges() 
End Sub 

Process_PDF.vb - 版本3
如果我有這樣的(如下圖),然後它完美的作品如果我還更新了文件,但如果我不更新的文件我上的SubmitChanges錯誤線(不管什麼更新檢查設置設爲):

無法將NULL值插入列「文件名」「MyDbName.dbo.Process_PDFs」; 列不允許有空值。更新失敗。該語句已終止。

Public Sub Update() 
    dc.Process_PDFs.Attach(Me) 
    dc.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, Me) 
    dc.SubmitChanges() '<--- ERRORS OUT HERE IF NO FILE UPDATE' 
End Sub 
+0

您的DataContext是單例,還是它的範圍?並請說明你得到了什麼錯誤。 – jaraics 2011-05-04 06:26:13

回答

0

好,最徹底的方法是檢索實體,更新需要更新的領域,並調用的SubmitChanges()。 (創建一個新的實體,並複製這些屬性的缺點是,如果新實體添加到實體中而不需要更新代碼,那麼維護起來並不容易)+反正LINQ需要原始實體,以便它可以確定已更新的字段...

+0

你如何建議我使用我發佈的當前代碼執行此操作?原來的實體已經分離,我不能***不分離它,因爲我的業務和我的表示層是分開的。 – EdenMachine 2011-05-03 22:25:43

+0

如果您擁有分離的實體,則可以使用Attach(updatedEntity,originalEntity)。 – jaraics 2011-05-04 06:26:47

+0

我不小心給了你賞金(這很好),但你的建議沒有奏效。你有我所有的代碼,所以我不知道還能給你什麼。我希望有人能夠指出我如何在我的初始請求中描述的場景中更新實體的簡單(但完整的)代碼示例。如果我沒有實體中的所有財產,我仍然希望能夠更新實體,而無需從當前實體逐一重新分配給新實體。當你的數據庫表中有100個字段時,這是不實際的,所以必須有一種方法來做到這一點。 – EdenMachine 2011-05-08 00:37:41