OData и вставка (AddLink) отношений «многие ко многим»

#wpf #odata #wcf-data-services

#wpf #odata #wcf-службы данных

Вопрос:

Ок, ребята, это сводит меня с ума. Я получил следующий объект (odata), который представляет структуру страницы, в которой у каждой страницы могут быть любые дочерние элементы и любые родители. (в основном график, в котором все узлы могут быть соединены). В базе данных это представлено отношением «многие ко многим» с двумя таблицами Page <-> PagePage <-> Page .

Объект страницы

Проблема в том, что я просто не могу вставить новый объект, включающий отношение. Последнее, что я пробовал, было:

     Page page = new Page()
    {
        Id = Guid.NewGuid(),
        Title = "New Page",
        Created = DateTime.Now,
        LastChanged = DateTime.Now,
        IsRedirected = false,
        Position = 0,
        Html = "Add your HTML here.",
        Parent = { parent }
    };

    this.Context.AddToPages(page);
    this.Context.AddLink(parent, "Children", page);
    parent.Children.Add(page);
    this.Context.SaveChanges();
  

Я не могу придумать, что еще можно попробовать. Кто-нибудь взломал это?

Правка 1: Вот изображение из диаграммы базы данных: схема базы данных

Правка 2: Сведения об исключении:

 System.Data.Services.Client.DataServiceRequestException was unhandled
  Message=An error occurred while processing this request.
  Source=System.Data.Services.Client
  StackTrace:
       at System.Data.Services.Client.DataServiceContext.SaveResult.HandleBatchResponse()
       at System.Data.Services.Client.DataServiceContext.SaveResult.EndRequest()
       at System.Data.Services.Client.DataServiceContext.SaveChanges(SaveChangesOptions options)
       at System.Data.Services.Client.DataServiceContext.SaveChanges()
       at PortfolioManagementConsole.Models.PageViewModel.SaveChanges(Object parameter) in C:UsersDanieldocumentsvisual studio 2010ProjectsPortfolioManagementServicePortfolioManagementConsoleModelsPageViewModel.cs:line 59
       at PortfolioManagementConsole.Common.RelayCommand.Execute(Object parameter) in C:UsersDanieldocumentsvisual studio 2010ProjectsPortfolioManagementServicePortfolioManagementConsoleCommonRelayCommand.cs:line 52
       at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at Telerik.Windows.Controls.RadButton.OnClick() in c:BuildsWPF_ScrumRelease_WPFSourcesDevelopmentCoreControlsButtonsRadButton.cs:line 348
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
       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.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
       at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
       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, Booleanamp; handled)
       at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Booleanamp; handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Booleanamp; 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.InvokeImpl(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(MSGamp; 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 PortfolioManagementConsole.App.Main() in C:UsersDanieldocumentsvisual studio 2010ProjectsPortfolioManagementServicePortfolioManagementConsoleobjx86DebugApp.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.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.Data.Services.Client.DataServiceClientException
       Message=<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code></code>
  <message xml:lang="de-CH">An error occurred while processing this request.</message>
</error>
       Source=System.Data.Services.Client
       StatusCode=500
       StackTrace:
            at System.Data.Services.Client.DataServiceContext.SaveResult.<HandleBatchResponse>d__1e.MoveNext()
       InnerException: 
  

Комментарии:

1. Какую ошибку вы получаете? Или просто объект, похоже, не вставлен?

2. В методе context.SaveChanges() возникает исключение DataServiceRequestException.

3. И сообщение об исключении?

4. Ну, в этом-то и проблема, это просто «Произошла ошибка при обработке этого запроса». Трассировка стека выдает мне «System.Data.Services». Клиент. DataServiceContext.SaveResult. HandleBatchResponse()» и внутреннее исключение выдает «Код состояния 500», то же сообщение и «TargetSite {Boolean MoveNext()}».

5. Хорошо, это ошибка, которую вы получаете на клиенте. Находится ли код сервера под вашим контролем? Можете ли вы посмотреть там, почему он вернул эту ошибку?

Ответ №1:

Ваш сервер WCF Data Services не возвращает подробные сообщения об ошибках, и это не помогает вам определить точное сообщение об ошибке, возвращаемое с сервера. Следуйте этим инструкциям, чтобы включить подробные сообщения об ошибках с сервера: http://blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net-data-services.aspx . После того, как вы включили это, вы должны быть в состоянии увидеть сообщение об ошибке, выдаваемое сервером.

Если посмотреть на вашу модель, вам понадобится другая ссылка от дочернего элемента обратно к родительскому. Добавьте эту строку в код прямо перед сохранением изменений :

это.Context.SetLink(страница, «Родитель», parent);

Чтобы помочь лучше понять это, вот несколько ссылок в моем блоге, где я подробно описываю, как работать с ассоциациями с использованием клиента WCF Data Services :

от 1 до многих ассоциаций

http://blogs.msdn.com/b/phaniraj/archive/2008/10/23/working-with-associations-in-ado-net-data-services-part-2.aspx

ассоциации от 1 до 1

http://blogs.msdn.com/b/phaniraj/archive/2008/07/02/working-with-relations-in-ado-net-data-services-beta-1.aspx