代码之家  ›  专栏  ›  技术社区  ›  Sergio

LINQ更新问题

  •  1
  • Sergio  · 技术社区  · 15 年前

    我在使用LINQ更新数据库时遇到一些问题…

     Public Shared Function Save(ByRef appointment As MyLinq.Appointment, ByRef db As MyEntities) As Boolean
    
            If appointment.id = 0 Then
                db.AddToAppointments(appointment)
            Else
                db.AttachTo("Appointments", appointment)
                'db.ApplyPropertyChanges("Appointments", appointment)
            End If
    
            Return db.SaveChanges() > 0
    
        End Function
    

    所以insert工作得很好,我已经尝试了两行代码来进行更新,但没有成功。第一个运行正常,但没有执行任何更新,第二个抛出异常…

    有人能指出我遗漏了什么吗?

    编辑:

    很抱歉迟回复…我有一些互联网连接问题…

    我必须“让它工作”,所以现在我的更新代码是从数据库中复制记录,更新然后执行“savechanges”方法。它可以工作,但我不高兴必须查询数据库来执行更新…如果您知道我如何在没有更新的情况下完成此操作,我将不胜感激:)

    克里斯:这是一个不错的尝试,但我的刷新方法只允许我选择“refreshmode.clientwins”或“refreshmode.storewins”,我尝试了clientwins但没有成功…

    拉齐:我很抱歉,但我没有保存例外,它不再发生了……它是说我的记录没有相关联的钥匙(或类似的东西)

    jon skeet:在vb.net中,我们必须指定参数是byval还是byref,不能像在c中那样省略。#

    2 回复  |  直到 15 年前
        1
  •  1
  •   Steve Willcock    15 年前

    applyPropertyChanges()调用很重要,否则假定要附加的项位于 unchanged 状态。然而。。。为了使ApplyPropertyChanges正常工作,原始对象必须存在于ObjectContext中,这意味着可以再次查询它(我认为您现在正在执行此操作),也可以使用最初从中提取该项的相同对象上下文。

    这里有更多信息- http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.applypropertychanges.aspx

        2
  •  2
  •   Chris Shaffer    15 年前

    您所拥有的代码与我以前使用的代码(linq to sql)不完全相同,但它看起来确实有点相似;这是实体框架吗?

    我知道使用Linq to SQL,仅仅将对象附加到数据上下文是不够的,还必须确保数据上下文知道原始值是什么,这样它就知道要更新哪些列。在Linq to SQL中,可以这样实现:

    db.Refresh(RefreshMode.KeepCurrentValues, appointment)
    

    也许环顾四周,看看你是否能在你使用的任何框架中实现类似的东西。