2008-12-17 31 views
1
我有LINQ更新的問題linqtosql

linqtosql不會允許領域的更新,因爲它投下他們,因爲只有

從下面的代碼

Dim lqPatientTable As New lqHospitalDataContext 
    Dim strPatientId As String 
    strPatientId = Me.ucboPatientInfo.SelectedRow.Cells(5).Value 

    Dim lqPatientName = (From lqp In lqPatientTable.Patients _ 
          Where lqp.PatientID = strPatientId _ 
          Select lqp.FirstName, lqp.LastName) 
    For Each row In lqPatientName 
     row.LastName = utxtPatientLastName.Text 
     row.FirstName = utxtPatientFirstName.Text 
    Next 
    lqPatientTable.SubmitChanges() 

的Visual Studio

告訴我,讀row.LastName是隻讀的,我沒有在任何地方做過這樣的調整,我也看不出問題在哪裏。

回答

2

當您僅選擇單個字段時,您正在創建一個不再是ORM變更跟蹤/更新機制一部分的匿名類型。

您需要將選擇部分更改爲「Select lqp」才能使其工作。

1

您分配給「For Each」循環的第一行中的row.LastName。

您是否在嚴格/顯式選項中打開或關閉選項?如果選項strict在該行不應該編譯。

您看到的原因是,當爲包含顯式Select子句的查詢創建匿名類型時,生成類型的所有屬性將爲只讀。它具有與使用Key字段在匿名類型中聲明所有屬性相同的效果。例如

Dim x = New With { Key .Name ="foo" } 
+0

所以爲了有寫入權限的字段,你將不得不選擇整個對象?選擇lqp 這很容易知道...... – BenAlabaster 2008-12-17 22:08:34

+0

在VB中,select子句是不必要的。如果省略,VB將選擇最後一個LINQ子句的結果。在這種情況下lqp – JaredPar 2008-12-17 23:38:35

0

當您爲數據上下文創建dbml文件時,是否將LastName屬性創建爲只讀字段?打開DBML發現場,並檢查屬性,以查看它是否設置爲只讀...

0

只讀上都設置爲false

選項Explicit和Option嚴格也都關

0

這就是一個實體框架比Linq2Sql更好(真的是唯一的事情!)。您可以從不同的表中選擇不同的字段,但它仍然可以更新。使用Linq2Sql,如果您從多個表中選擇(即使在這裏您不是,但是當您創建一個新的匿名類型,這是同樣的想法)它變成只讀。

相關問題