linqtosql不允许更新字段,因为它将它们转换为只读

时间:2008-12-17 21:57:08

标签: vb.net linq linq-to-sql

我在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,我无法看到问题所在。

5 个答案:

答案 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,如果您从多个表中进行选择(即使这里没有,但是当您创建一个新的匿名类型时,它是相同的想法)它变为只读。