我在使用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
所以插入工作正常,我已经尝试了两行代码进行更新而没有成功...第一个没问题,但没有执行更新,第二个抛出异常......
有人可以指出我错过了什么吗?
编辑:
很抱歉迟到的回复......我遇到了一些互联网连接问题......
我必须“让它工作”,所以现在我的更新代码正在从数据库中记录记录,更新然后执行“SaveChanges”方法。它工作但我不高兴不得不查询数据库来执行更新...如果您有任何想法如何在没有更新的情况下做到这一点,我将不胜感激:)
Chris:这是一个不错的尝试,但我的刷新方法只允许我选择“RefreshMode.ClientWins”或“RefreshMode.StoreWins”我尝试使用ClientWins但没有成功...
Razzie:我很抱歉,但我没有保存例外而且不再发生......这是说我的记录没有关联的密钥(或类似的东西)
Jon Skeet:在Vb.Net中我们必须指定参数是否为ByVal或ByRef,我们不能像在C#中那样省略
答案 0 :(得分:2)
你拥有的代码看起来并不像我习惯的那样(linq to sql),但它看起来有点类似;这是实体框架吗?
我知道使用Linq to SQL,仅仅将对象附加到数据上下文是不够的,还必须确保数据上下文知道原始值是什么,因此它知道要更新哪些列。在Linq to SQL中可以像这样实现:
db.Refresh(RefreshMode.KeepCurrentValues, appointment)
也许环顾四周,看看你是否可以在你正在使用的任何框架中实现类似的东西。
答案 1 :(得分:1)
ApplyPropertyChanges()调用很重要,否则假设您附加的项目处于unchanged状态。但是......为了使ApplyPropertyChanges正常工作,原始对象必须存在于ObjectContext中,这意味着要么再次查询它(我认为你现在正在做)或使用你最初从中提取项目的相同对象上下文。
此处提供更多信息 - http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.applypropertychanges.aspx