none
Detect whether DataContext has changes

    Question

  • Hello,

     

    I need to detect whether a DataConext has any pending changes. I need to display a warning if so when a user wants to close a dialog but changes have not been saved.

     

    I'd need a property of DataContext like .HasChanges or so, but it does not exist. I wrote a suggestion however, but can't wait a year for this.

     

    So I tried to use the GetChangeSet() method to find pending changes. But I ran into a (SERIOUS) bug that was reported in May 2008 under

     

    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=367402

     

    This bug was NOT address in SP1. So it seems I can't use this method either!!!

     

    Any idea how I can figure this out?

     

    Thanks!

    Karlo

    Friday, September 19, 2008 1:07 PM

All replies

  • Hi 

    You can figure out pending changes with using ChangeSet class:


     ChangeSet changeSet = DataContext.GetChangeSet();

     if (changeSet.Deletes.Count != 0 || changeSet.Inserts.Count != 0 || changeSet.Updates.Count != 0)
                  
     return false;
       
     return true;


    Saturday, September 20, 2008 4:38 AM
  •  

    Ali,

    as I wrote in my original post, calling DataContext.GetChangeSet produces an exception and probably side effect due to a bug in the DataContext class. So I can't use it.

     

    Here's the link to the bug report:

    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=343378&wa=wsignin1.0

     

    I think this bug MUST be fixed soon by Microsoft!

     

    Any other ideas?

     

    Thanks

    Karlo

    Saturday, September 20, 2008 8:27 AM
  • A .HasChanges() bool property would be great.  I know that the GetChanges() method can be used, but I makes for ugly hard to read code.
    Monday, September 22, 2008 12:54 PM
  • ... an in fact GetChanges() can't be used because of the bug. Maybe you want to vote for my feature request.

    Regards

    Karlo

    Monday, September 22, 2008 1:36 PM
  • Has there ever been a reponse on this from MS?

    I have added a HasChanges extension, and CancelChanges as well...both work well until I have a datagrid with child items.  Once I add and remove child items (ie. lines on an invoice) and attempt to call db.CancelChanges(), which in turn calls getChangeSet, I get the error...

    "An attempt was made to remove a relationship between a transact and a item. However, one of the relationship's foreign keys (item.invoiceid, item.customerid) cannot be set to null."

    I know I can drop the context and recreate it, but I would rather not.
    I saw the workaround to set my relationships to Null...but I have 108 tables and many lines of code.

    Tuesday, September 29, 2009 6:02 PM
  • Hello Jeffrey,

    yes, I received some workaround code from Mircosoft. I had a service request under the id number SRQ081010600582. I'm not sure if I'm allowed to share the code file here in public. But you might want to write to gawronr@microsoft.com (or somebody else from developer support) and give them that number and ask for the workaround.

    hth
    Karlo
    Thursday, October 01, 2009 4:33 PM