我在linqtosql
中遇到linq更新问题来自以下代码
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是readonly我没有在任何地方进行asignment,我无法看到问题所在。
答案 0 :(得分:2)
当您只选择单个字段时,您正在创建一个匿名类型,该类型不再是ORM的更改跟踪/更新机制的一部分。
您需要将选择部分更改为“选择lqp”才能使其生效。
答案 1 :(得分:1)
您在“For Each”循环的第一行中分配给row.LastName。
您是否正在使用选项严格/显式打开或关闭?如果选项strict在该行上不应该编译。
您看到这一点的原因是为包含显式Select子句的查询创建匿名类型时,结果类型上的所有属性都将是只读的。它具有与使用Key字段在匿名类型上声明所有属性相同的效果。例如
Dim x = New With { Key .Name ="foo" }
答案 2 :(得分:0)
为数据上下文创建dbml文件时,是否将LastName属性创建为只读字段?打开dbml查找字段并检查属性以查看它是否设置为readonly ...
答案 3 :(得分:0)
readonly on both设置为false
Option Explicit和Option strict也都关闭
答案 4 :(得分:0)
这是实体框架比Linq2Sql更好的一件事(真的是唯一的东西!)。您可以从不同的表中选择各种字段,但它仍然可以更新。使用Linq2Sql,如果您从多个表中进行选择(即使这里没有,但是当您创建一个新的匿名类型时,它是相同的想法)它变为只读。