1

I can't update when I change some field in my table.

  • Database ==> mysql
  • .net framework ==> 4.0
  • platform==> wpf app

let me explain step by step

my aim is updating item which already exists in table.

   public bool SaveToVideoInfo(List<tblvideoinfo> vList,sbyte profilID)
    {
                     foreach (tblvideoinfo _videoinfo in vList)
            {

                try
                {

                ent.AddTotblvideoinfo(_videoinfo);
                ent.AddTotblprocess(CreateProcess(profilID,_videoinfo.VideoID));
                ent.SaveChanges();

                }
                catch (UpdateException )
                {

                   return UpdateToVideoInfo(_videoinfo);
                }            
        }

            return false;                     
    }

if already item exists in table, I'm catching this exception and calling my update function

    public bool UpdateToVideoInfo(tblvideoinfo vInfo)
    {

        var updatingItem = (from a in ent.tblvideoinfo
                  where a.VideoID == vInfo.VideoID
                  select a).First();

        updatingItem.SearchKeywords = vInfo.SearchKeywords;
        updatingItem.SearchTimeStamp = DateTime.Now;

        return ent.SaveChanges() > 0;

    }

because if it exists in table, I want to change some field as I wrote above. Everything is fine until running ent.SaveChanges()

I checked updatingItem has been changed which I set properties (SearchKeywords ,SearchTimeStamp )

But this error occurs

error occurred while updating the entries. See the inner exception for details

here are details

 at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
   at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Objects.ObjectContext.SaveChanges()
   at MyDbHelper.DBHelper.UpdateToVideoInfo(tblvideoinfo vInfo)
   at MyDbHelper.DBHelper.SaveToVideoInfo(List`1 vList, SByte profilID)
   at youtube.MainWindow.p_Drop_Event(Object sender, Object to) in C:\Users\xxxxxx....\...\MainWindow.xaml.cs:line 1125
   at youtube.product.UserControl_MouseUp(Object sender, MouseButtonEventArgs e) in C:\Users\xxxxxx....\...\product.xaml.cs:line 239
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()
   at youtube.App.Main() in C:\Users\xxxxxx....\...\Debug\App.g.cs:line 0
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

here is detail of updatingItem

here is detail of updatingItem

means,

    updatingItem.SearchKeywords = vInfo.SearchKeywords;
    updatingItem.SearchTimeStamp = DateTime.Now;

these codes are work.

by the meantime, VideoID is unique in my table then I cant add item which has same VideoID. But I want to update it. I think updating issue comes from here.

I don't want to use sql commands.

I just want to update two fields of the table ...

4
  • What is the description of the inner exception? Commented Aug 16, 2012 at 13:10
  • I already wrote there under "here are details" Commented Aug 16, 2012 at 13:11
  • 1
    That's the stacktrace Not the description Commented Aug 16, 2012 at 13:17
  • ahh sorry.. here is Duplicate entry '18078437' for key 'VideoID_UNIQUE' Commented Aug 16, 2012 at 13:20

3 Answers 3

1

My guess is that when you call SaveChanges again on the same context it is trying to insert repeat the insert operation and fails again.

Calling ent.AcceptAllChanges() in the beginning of the catch block may work.

Maybe disposing the context and creating another one to use in the update function would be your easiest option. Otherwise, you will need to change the ObjectStateEntry.State to Unchanged for the two entities (videoinfo, process) you try to insert.

Sign up to request clarification or add additional context in comments.

3 Comments

thanx. ent.AcceptAllChanges(); it made to remove error. but at this time, savechanges method returns 0 and in table, no any changing..
Did you try placing that call in the beginning of the catch block?
no i didnt :) but it works. you are great :) thank you very very much :) I wrote it beginin of catch block and worked :)
1

try to call

var updatingItem = (from a in ent.tblvideoinfo
                  where a.VideoID == vInfo.VideoID
                  select a).FirstOrDefault();

and you are using

 updatingItem.SearchTimeStamp = DateTime.Now;

Does your database using the same data type (datetime) for this field?

One option is to handle the ObjectContext.SavingChanges Event, which gives you a chance to perform validation on entities before the changes are saved and even cancel the save if necessary. This way you can make sure any non-nullable properties are set before trying to save changes, and avoid having to rely on exception handling.

2 Comments

I already can save items. but if item which has same videoid in table i cant update it.but @Omtara solved that problem
thanx for attention. i dont have any problem with updatingitem it was fine as i mentioned that. But its okay not it works and no problem :) thank you
0

Is there no way to check if the item is new? You could set the id to a 0 value or something so you can easily see if the item is new.

If that's not possible you can use SingleOrDefault on the Id to check if the entity exists. That way you can avoid the updatexception and handle everything in one call. Depending on database exceptions for this scenario is not a very clean solution.

Handling everything in one call should solve your problems.

2 Comments

I see but the problem is how can I update this item? its not possible ? in sql, i would wrote that "update tblvideoinfo set SearchKeywords='bla bla' and SearchTimeStamp ='bla bla' where videoID='blabla...' "
Loading an item and modifying it within the scope of the ObjectContext tracks changes automatically. Calling SaveChanges will generate the update Sql

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.