【问题标题】:ASP.NET MVC + Dynamics NAV odata web services - how do I access related models?ASP.NET MVC + Dynamics NAV odata Web 服务 - 如何访问相关模型?
【发布时间】:2015-02-03 13:33:04
【问题描述】:

我正在使用 Dynamics NAV Odata Web 服务构建一个 asp.net mvc 应用程序。 Evertyhing 工作正常,我使用 Linq 查询为服务订单创建了一个控制器。然后我进入下一步:访问相关模型,我被卡住了。

让我们以第 5900 页 - 服务订单和第 5903 页 - 服务项目行为例:

获取服务订单或任何其他单一模型效果很好:

var query = from c in nav.ServiceOrder 
            select c;

但是访问相关数据失败:

var query = nav.ServiceOrder
            .Expand(x => x.ServiceOrderServItemLines)
            .Where(x => x.No == "SO000008");

我可以使用以下 url 访问 ServiceOrderServItemLines:

/DynamicsNAV71/OData/Company('the company')/ServiceOrder(Document_Type='Order',No='SO000008')/ServiceOrderServItemLines

但使用 expand 似乎不起作用。

我不确定问题是什么。模型之间没有关系吗?

如果是这样,我是否可以通过关系添加自己的模型,并将它们连接到 odata 服务?

或者只是服务中不支持扩展的问题?

任何意见将不胜感激。

【问题讨论】:

  • 是那些带有()s 的网址吗?您的代码 sn-ps 令人困惑
  • 是的,这些是 URL。这有点令人困惑,所以我做了一些改变。感谢您指出@DLeh。

标签: asp.net-mvc web-services odata microsoft-dynamics


【解决方案1】:

您的 serviceOrder 似乎有两个键。一个是Document_Type,一个是No。所以请尝试

var query = nav.ServiceOrder
    .Expand(x => x.ServiceOrderServItemLines)
    .Where(x => x.Document_Type == "Order" && x.No == "SO000008");

如果不能解决您的问题,能否提供展开查询发送的网址?

【讨论】:

    【解决方案2】:

    所以在我反对这个问题一段时间后,我想我有一个答案。我将在这里发布我的发现,希望它可以在将来为某人省去一些麻烦。

    Dynamics NAV (2013 R2) 具有标题和列表项之间的关系,如下所述: http://blogs.msdn.com/b/freddyk/archive/2009/05/28/handling-sales-orders-from-page-based-web-services-in-nav-2009sp1-and-rtm.aspx

    就我而言,我想为服务订单创建和访问服务项目行。

    使用SOAP创建Service Orders(Service Header表)和Service Item Lines可以这样完成:

        static void Main(string[] args)
        {
            ServiceOrder_Binding ctx = new ServiceOrder_Binding();
            ctx.UseDefaultCredentials = true;
    
            //Create a new Service Order
            ServiceOrder so = NewSo(ctx);
    
            //Add a couple of Service Item Lines to the Service Order
            for (int i = 0; i < 5; i++)
                NewSil(ctx, so.No);
        }
    
        private static ServiceOrder NewSo(ServiceOrder_Binding ctx)
        {
            ServiceOrder so = new ServiceOrder();
            so.Customer_No = "50000";
            so.Description = "New Service Order";
            ctx.Create(ref so);
            return so;
        }
    
        private static void NewSil(ServiceOrder_Binding ctx, string documentNo)
        {
            ServiceOrder so = ctx.Read(documentNo);
            List<Service_Order_Line> SilList = so.ServItemLines.ToList();
            Service_Order_Line Sil = new Service_Order_Line();
            Sil.ServiceItemNo = "20";
            Sil.Description = "New Service Item Line";
            SilList.Add(Sil);
            so.ServItemLines = SilList.ToArray();
            ctx.Update(ref so);
        }
    

    使用Odata读取Service Orders(Service Header表)和Service Item Lines可以这样完成:

        static void Main(string[] args)
        {
            NAV ctx = new NAV(new Uri("http://localhost:7048/DynamicsNAV71/OData/Company('CRONUS Sverige AB')"));
            ctx.UseDefaultCredentials = true;
    
            //Eager loading - DOES NOT WORK!
            var so = from s in ctx.ServiceOrder.Expand("ServiceOrderServItemLines")
                     where s.No == "SO000016"
                     select s;
    
            //Lazy loading - WORKS!
            var so2 = from s in ctx.ServiceOrder
                     where s.No == "SO000016"
                     select s;
    
            ctx.LoadProperty(so2.First(), "ServiceOrderServItemLines");
        }
    

    请注意延迟加载有效,但急切加载无效。

    对于其他相关数据,例如服务项目行的服务项目,似乎没有任何关系。如果我发现其他东西,我会返回更新,但我现在最终做的是像这样在 ViewBag 中传递相关项目:

    在控制器动作中:

        var service_items = from s in ctx.ServiceItemList
                            where s.Customer_No.Equals(customerNo)
                            select s;
    
        var serviceItemList = service_items.ToList();
    
        ViewBag.serviceItemList = new SelectList(serviceItemList, "No", "Description");
    

    在视图中:

        @Html.DropDownListFor(model => model.Service_Item_No, (IEnumerable<SelectListItem>)ViewBag.serviceItemList)
    

    希望这可以帮助像我一样不熟悉 Dynamics NAV 和 Web 服务的人:)。

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2018-04-10
      • 2019-06-11
      相关资源
      最近更新 更多