Re: LINQ for SQL Conflict Resolution

Simon Robinson <[email protected]> Mon, 6 Apr 2009 05:56:13 -0400
Newsgroups gmane.comp.windows.devel.dotnet.advanced
Message-ID <LISTSERV%[email protected]>
:-)  It may well come to that for me too. I was hoping to avoid having to do that because it'd be a fair bit of work, harder to maintain going forward, and would be a departure from how this particular DB is normally accessed.

Simon

On Wed, 1 Apr 2009 11:47:58 -0700, Helen Warn <[email protected]> wrote:

>What I have done to avoid some of these pitfalls is to write my own stored
>procs for CUD operations, and then in the data model for the table, instead
>of using the default option of "Use Runtime" I customize the Insert, Update,
>and Delete operations to use my stored procs. This adds them to the methods
>of the data context, so in code I use something like:
>
>    public int DeletePicture(Guid picture_uid)
>    {
>      using (MyDataContext context = new MyDataContext())
>      {
>        return context.delPicture(picture_uid);
>      }
>    }
>
>In the above, my stored proc returns an integer (actually @@rowcount).
>
>You may still not be out of the woods -- I found that I had to set some
>properties of FKs, etc. to cascade, but it got me around problems I had when
>I just let the runtime handle CUD operations.
>
>Hope this helps,
>
>Helen
>
>-----Original Message-----
>From: Discussion of advanced .NET topics.
>[mailto:[email protected]] On Behalf Of Simon Robinson
>Sent: Wednesday, April 01, 2009 11:37 AM
>To: [email protected]
>Subject: [ADVANCED-DOTNET] LINQ for SQL Conflict Resolution
>
>I have a problem with a database update that is going through LINQ for SQL,
>via a call to DataContext.SubmitChanges().
>
>For reasons to do with auditing, we never delete records in this table
>directly; if we wish to delete a record, we do so by updating it to set an
>IS_DELETED bit field to 1. This is immediately picked up by an AFTER UPDATE
>trigger which does various auditing actions and then deletes the record.
>
>The problem is this is throwing LINQ's concurrency processing: If I try to
>mark a record for deletion, the record isn't deleted, and SubmitChanges()
>throws the dreaded ChangeConflictException. The exception goes away if I
>comment out the line in the trigger that deletes the row.
>
>Under the hood: It looks to me like SubmitChanges is sending two requests to
>SQL server: An UPDATE to make the changes, immediately followed by a SELECT
>to verify that there are no concurrency issues. I think the trigger is
>getting in first, resulting in the SELECT returning no rows, hence the
>exception. For some reason this also seems to result in the delete getting
>rolled back, which is more serious (I'm not clear how that happens; it may
>indicate my analysis of what's going on under the hood isn't quite
>correct.).
>
>So in short - is there any easy way to tell DataContext.SubmitChanges() not
>to worry if the row it thinks it's updated disappears? Or any other
>solution?
>
>===================================
>View archives and manage your subscription(s) at
>http://peach.ease.lsoft.com/archives
>
>===================================
>View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives

===================================
View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives