1

テーブルの一部のフィールドを変更すると更新できません。

  • データベース==>mysql
  • .netフレームワーク==>4.0
  • プラットフォーム==>wpfアプリ

ステップバイステップで説明させてください

私の目的は、テーブルにすでに存在するアイテムを更新することです。

   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;                     
    }

すでにアイテムがテーブルに存在する場合、この例外をキャッチして更新関数を呼び出しています

    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;

    }

テーブルに存在する場合は、上記のようにフィールドを変更したいからです。ent.SaveChanges()を実行するまではすべて問題ありません

プロパティ(SearchKeywords、SearchTimeStamp)を設定したupdateingItemが変更されていることを確認しました

しかし、このエラーは発生します

エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください

詳細はこちら

 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()

こちらがupdateingItemの詳細です

こちらがupdateingItemの詳細です

意味、

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

これらのコードは機能しています。

その間、VideoIDは私のテーブルで一意であるため、同じVideoIDを持つアイテムを追加できません。しかし、私はそれを更新したいと思います。更新の問題はここから来ると思います。

SQLコマンドを使いたくありません。

テーブルの2つのフィールドを更新したいだけです...

4

3 に答える 3

1

私の推測では、同じコンテキストでSaveChangesを再度呼び出すと、挿入を繰り返して挿入操作を繰り返し、再度失敗します。

ent.AcceptAllChanges()キャッチブロックの先頭での呼び出しは機能する場合があります。

コンテキストを破棄して、更新機能で使用する別のコンテキストを作成するのが最も簡単なオプションかもしれません。それ以外の場合は、挿入しようとしている2つのエンティティ(videoinfo、process)のObjectStateEntry.Stateをに変更する必要があります。Unchanged

于 2012-08-16T13:13:30.530 に答える
1

電話してみてください

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

そしてあなたは使用しています

 updatingItem.SearchTimeStamp = DateTime.Now;

データベースはこのフィールドに同じデータ型(日時)を使用していますか?

1つのオプションは、ObjectContext.SavingChangesイベントを処理することです。これにより、変更を保存する前にエンティティの検証を実行し、必要に応じて保存をキャンセルすることもできます。このようにして、変更を保存する前にnull許容でないプロパティが設定されていることを確認し、例外処理に依存する必要をなくすことができます。

于 2012-08-16T13:20:16.933 に答える
0

アイテムが新しいかどうかを確認する方法はありませんか?idアイテムが新しいかどうかを簡単に確認できるように、0などの値に設定できます。

それが不可能な場合はSingleOrDefault、IDでエンティティが存在するかどうかを確認できます。そうすれば、updatexceptionを回避し、1回の呼び出しですべてを処理できます。このシナリオのデータベースの例外によっては、あまりクリーンなソリューションではありません。

1回の呼び出しですべてを処理すると、問題が解決するはずです。

于 2012-08-16T13:09:12.230 に答える