2011-08-31 55 views
2

我已阅读这里的帖子,找不到任何尤里卡答案,所以这里是我的。 Linq到SQl不会将更改传播回数据库。LINQ to SQL没有更新db的问题

这是我的代码。有什么突出的东西吗? 对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插入,在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 
+0

有时只是重新创建DBML可以帮助 – Pleun

+0

不,从头重新创建dbml没有帮助。仍然在GetChangeSet中显示0项 –

回答

2

尝试删除自定义类代码,只是选择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失败,因为它没有看到任何本地对象被选中,正在注册一个变化。您不会更改任何名称,因此无需指定要缩小的显式值。

+0

这似乎已经照顾它,谢谢! –

+0

AdminClarifireSetup类型只是.dbml文件中单个表的定义。我的自定义类是ClarifireSetup。但它看起来像单个需要是对象AdminClarifireSetup,实际的表对象,以便SubmitChanges传播回到数据库 –

0

难道说你缺少

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

dc.ClarifireSetups ...不高兴 –

+0

该表名为AdminClarifireSetups,我的类名为ClarifireSetup 因此,dc.ClarifireSetup不起作用,因为它不是表格。 InsertOnSubmit需要表的一个实体作为参数,而不是类对象 –

+0

InsertOnSubmit失败,它试图插入,不更新..看到上面 –