views:

864

answers:

2

Hello,

I'm having some problems updating the database using 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

So Insert works fine, i have tryed both lines of code for the update with no sucesss... The first one goes ok but no update is performed, the second one throws an exception...

Can someone point out what i am missing?

EDIT:

Sorry for the late reply... I had some internet connection problems...

I had to "make it work", so now my update code is fecthing the record from the database, updating and then executing "SaveChanges" method. It works but I am not happy having to query the database to perform an Update... If you have any idea how I could do this without an update I would appreciate :)

Chris: It was a nice try, but my refresh method only allows me to choose "RefreshMode.ClientWins" or "RefreshMode.StoreWins" I tried with ClientWins with no success...

Razzie: I am sorry but i did not save the exception and it no longer occurs... It was saying that my record did not have a key associated (or something similar)

Jon Skeet: In Vb.Net we have to specify if the parameter goes ByVal or ByRef, we can't omit like in C#

+2  A: 

The code you have doesn't look exactly like what I'm used to (linq to sql), but it does look a little similar; Is this Entity Framework?

I know with Linq to SQL, simply attaching an object to the data context isn't enough, you also have to make sure that the data context knows what the original values are so it knows which columns to update. In Linq to SQL that can be achieved like this:

db.Refresh(RefreshMode.KeepCurrentValues, appointment)

Maybe look around and see if you can achieve something similar in whatever framework you are using.

Chris Shaffer
+1  A: 

The ApplyPropertyChanges() call is important otherwise the item you are attaching is assumed to be in an unchanged state. However... for ApplyPropertyChanges to work properly the original object must exist in the ObjectContext which means either querying for it again (which I think you are now doing) or using the same object context that you originally pulled the item from.

Some more info here - http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.applypropertychanges.aspx

Steve Willcock
I am doing this on a aspx... So using the same context is not an option... I am Querying it again... but i have this feeling of wasting resources....
Sergio
Yes, I know what you mean - it seems like an unnecessary trip to the database. An optimistic concurrency exception would be enough in this situation you'd think. Maybe we'll get that option with EF v2. :)
Steve Willcock