【问题标题】:Problem with LINQ to SQL not updating dbLINQ to SQL 不更新数据库的问题
【发布时间】:2011-08-31 12:24:38
【问题描述】:

我已阅读此处的帖子,但找不到任何尤里卡答案,所以这就是我所拥有的。 Linq to SQl 不会将更改传播回数据库。

这是我的代码。有什么突出的吗? 对 dc.GetChangeSet 的调用显示 0 个更改。 我错过了什么?我可以看到“设置”中的新值被设置为 cs 对象属性。 SettingID 是我表中的主键,在 dbml 中显示为 PK,所以这不是问题。

Public Shared Function Update(ByVal setting As ClarifireSetup) As Boolean

    Dim cs As ClarifireSetup

    Try
        Using dc As New AdminClarifireSetupDataContext(TripleDESSecurity.Decrypt(SharedData.PortalCnx))
            cs = (From d In dc.AdminClarifireSetups
                  Where d.SettingID = setting.SettingID
                  Select New ClarifireSetup With {
                    .SettingID = d.SettingID,
                    .SettingKey = d.SettingKey,
                    .SettingValue = d.SettingValue,
                    .FriendlyName = d.FriendlyName,
                    .DisplayOrder = d.DisplayOrder
               }).FirstOrDefault()

            If cs IsNot Nothing Then
                cs.SettingID = setting.SettingID
                cs.SettingKey = setting.SettingKey
                cs.SettingValue = setting.SettingValue
                cs.FriendlyName = setting.FriendlyName
                cs.DisplayOrder = setting.DisplayOrder
                dc.GetChangeSet()
                dc.SubmitChanges()
            End If
        End Using

        Return True

    Catch ex As Exception
        Throw
    Finally
        If Not cs Is Nothing Then
            cs.Dispose()
            cs = Nothing
        End If
    End Try

End Function

编辑: 将我的代码更改为此,InsertOnSubmit 显示 1 Insert,在 dc.SubmitChanges 时由于 cconflict 而出错。它试图插入,而不是更新......

Public Shared Function Update(ByVal setting As ClarifireSetup) As Boolean

    Dim cs As AdminClarifireSetup

    Try
        Using dc As New AdminClarifireSetupDataContext(TripleDESSecurity.Decrypt(SharedData.PortalCnx))
            'cs = (From d In dc.AdminClarifireSetups
            '      Where d.SettingID = setting.SettingID
            '      Select New AdminClarifireSetup With {
            '        .SettingID = d.SettingID,
            '        .SettingKey = d.SettingKey,
            '        .SettingValue = d.SettingValue,
            '        .FriendlyName = d.FriendlyName,
            '        .DisplayOrder = d.DisplayOrder
            '   }).FirstOrDefault()
            cs = New AdminClarifireSetup

            If cs IsNot Nothing Then
                cs.SettingID = setting.SettingID
                cs.SettingKey = setting.SettingKey
                cs.SettingValue = setting.SettingValue
                cs.FriendlyName = setting.FriendlyName
                cs.DisplayOrder = setting.DisplayOrder
                dc.SubmitChanges()
            End If
        End Using

        Return True

    Catch ex As Exception
        Throw
    Finally
        If Not cs Is Nothing Then
            cs = Nothing
        End If
    End Try

End Function

【问题讨论】:

  • 有时只是重新创建您的 DBML 会有所帮助
  • 不,从头开始重新创建 dbml 并没有帮助。 GetChangeSet 中仍显示 0 个项目

标签: vb.net asp.net-mvc-3 linq-to-sql .net-4.0


【解决方案1】:

尝试删除自定义类代码,然后选择 d。

Dim cs as AdminClarifireSetup ' This looks like the actual object type

Try
        Using dc As New AdminClarifireSetupDataContext(TripleDESSecurity.Decrypt(SharedData.PortalCnx))
            cs = (From d In dc.AdminClarifireSetups
                  Where d.SettingID = setting.SettingID
                  Select d).Single()

            If cs IsNot Nothing Then
                cs.SettingID = setting.SettingID
                cs.SettingKey = setting.SettingKey
                cs.SettingValue = setting.SettingValue
                cs.FriendlyName = setting.FriendlyName
                cs.DisplayOrder = setting.DisplayOrder
                dc.GetChangeSet()
                dc.SubmitChanges()
            End If
        End Using

我的想法是 GetChangeSet 失败了,因为它没有看到任何选择的正在注册更改的本机对象。您没有更改任何名称,因此无需指定要缩小范围的显式值。

【讨论】:

  • AdminClarifireSetup 类型只是.dbml 文件中单个表的定义。我的自定义类是 ClarifireSetup。但看起来 Single 需要是对象 AdminClarifireSetup(实际的表对象),以便 SubmitChanges 传播回数据库
【解决方案2】:

难道是你不见了

...
dc.ClarifireSetups.InsertOnSubmit( cs )
dc.SubmitChanges()

【讨论】:

  • dc.ClarifireSetups... 不开心
  • 该表称为 AdminClarifireSetups,我的类称为 ClarifireSetup 所以 dc.ClarifireSetup 不起作用,因为它不是表。 InsertOnSubmit 需要一个表的实体作为参数,而不是类对象
  • InsertOnSubmit 失败,它正在尝试插入,而不是更新.. 请参阅上面的编辑代码
  • 哦,好吧,我以为您是在尝试从 AdminClarifireSetups 复制到 ClarifireSetups,因为您在从中选择时使用了 new :)
  • 我按照 Telerik 支持的说明使用原始代码...但它显然没有工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多