C# 投递到Odata服务仅接收pimitive数据

C# 投递到Odata服务仅接收pimitive数据,c#,entity-framework-4,odata,C#,Entity Framework 4,Odata,我正在构建一个ODataWeb服务并利用实体框架,我的目的是发布一个具有一些基本属性的给定收据。收据还包含一个ReceiptLines集合,它也由原语属性组成 这里是我的问题:我可以张贴到服务刚刚好。当我使用调试器在服务器端逐步完成Post过程时,我正在过帐的收据不再包含任何收据行。我确认我确实提交了收据和收据行。在我的设计中,当我从客户那里发布时,是否遗漏了一些遗漏的接收行 我已经在下面包含了来自我的ReceiptController、WebApiConfig和元数据的代码。欢迎任何建议 接收

我正在构建一个ODataWeb服务并利用实体框架,我的目的是发布一个具有一些基本属性的给定收据。收据还包含一个ReceiptLines集合,它也由原语属性组成

这里是我的问题:我可以张贴到服务刚刚好。当我使用调试器在服务器端逐步完成Post过程时,我正在过帐的收据不再包含任何收据行。我确认我确实提交了收据和收据行。在我的设计中,当我从客户那里发布时,是否遗漏了一些遗漏的接收行

我已经在下面包含了来自我的ReceiptController、WebApiConfig和元数据的代码。欢迎任何建议

接收控制器:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.OData;
using System.Web.OData.Routing;
using AccountsReceivableWebService.Models;

namespace AccountsReceivableWebService
{
  public class ReceiptsController : ODataController
  {
    static ReceiptsContext db = new ReceiptsContext() { Receipts = new List<Receipt>() };

    #region Receipt portion

    private bool ReceiptExitsts(string key)
    {
      return db.Receipts.Count(r => r.ReceiptId == key) > 0;
    }

    [EnableQuery]
    public IQueryable<Receipt> Get()
    {
      return db.Receipts.AsQueryable();
    }

    [EnableQuery]
    public Receipt Get([FromODataUri] int key)
    {
      return db.Receipts.First(r=>r.ReceiptId==key.ToString());
    }

    /// <summary>
    /// This is the Post portion of CRUD operations.
    /// </summary>
    /// <param name="receipt"></param>
    /// <returns></returns>
    public IHttpActionResult Post(Receipt receipt)
    {
      if (!ModelState.IsValid) return BadRequest(ModelState);
      if (!receipt.Insert())
      {
        //db.Receipts.Add(receipt);
        BadRequest(receipt.Proof());
      }
      else
      {
        if (db.Receipts.Count(r => r.ReceiptId == receipt.ReceiptId) == 0)
          db.Receipts.Add(receipt);
      }
      return Created(receipt);
    }

    /// <summary>
    /// Checks that this receipt is a valid receipt
    /// </summary>
    /// <returns></returns>
    [HttpPost]
    public IHttpActionResult Proof([FromBody] Receipt parameters)
    {
      string returnStr = "";
      if (!ModelState.IsValid) return BadRequest(ModelState);
      foreach (Receipt r in db.Receipts)
      {
        string temp = r.Proof();
        if (temp != "")
        {
          returnStr = string.Format("{0}: {1};", r.ReceiptId, temp);
        }
      }
      return Ok(new List<string>() {"hello"});
    }
    #endregion

    #region ReceiptLine portion

    [ODataRoute("Receipts({receiptId})/ReceiptLines/AccountsReceivableWebService.GetCount()")]
    public IHttpActionResult GetCount(string receiptId)
    {
      return Ok(db.Receipts.Single(r => r.ReceiptId == receiptId).ReceiptLines.Count);
    }
    #endregion
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
使用System.Linq;
Net系统;
使用System.Threading.Tasks;
使用System.Web.Http;
使用System.Web.OData;
使用System.Web.OData.Routing;
使用AccountsReceivebleWebService.Models;
命名空间帐户ReceiveableWebService
{
公共类接收器控制器:ODataController
{
静态ReceiptsContext db=new ReceiptsContext(){Receipts=new List()};
#区域接收部分
私有bool receiptexits(字符串键)
{
返回db.Receipts.Count(r=>r.ReceiptId==key)>0;
}
[启用查询]
公共IQueryable Get()
{
返回db.Receipts.AsQueryable();
}
[启用查询]
公共收据获取([FromODataUri]int-key)
{
返回db.Receipts.First(r=>r.ReceiptId==key.ToString());
}
/// 
///这是CRUD操作的Post部分。
/// 
/// 
/// 
公共IHttpActionResult Post(收据)
{
如果(!ModelState.IsValid)返回BadRequest(ModelState);
如果(!receive.Insert())
{
//db.receives.Add(收据);
错误请求(receipt.Proof());
}
其他的
{
if(db.Receipts.Count(r=>r.ReceiptId==receipt.ReceiptId)==0)
db.receives.Add(收据);
}
已创建的退货(收据);
}
/// 
///检查此收据是否有效
/// 
/// 
[HttpPost]
公共IHttpActionResult证明([FromBody]接收参数)
{
字符串returnStr=“”;
如果(!ModelState.IsValid)返回BadRequest(ModelState);
foreach(收据r以db.收据为单位)
{
字符串温度=r.证明();
如果(温度!=“”)
{
returnStr=string.Format(“{0}:{1};”,r.ReceiptId,temp);
}
}
返回Ok(新列表(){“hello”});
}
#端区
#区域接收线部分
[ODataRoute(“收据({receiptId})/ReceiptLines/AccountsReceiveableWebService.GetCount()”)
公共IHttpActionResult GetCount(字符串receiptId)
{
返回Ok(db.Receipts.Single(r=>r.ReceiptId==ReceiptId.ReceiptLines.Count);
}
#端区
}
}
WebApiConfig:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using AccountsReceivableWebService.Models;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;

namespace AccountsReceivableWebService
{
  public static class WebApiConfig
  {
    public static void Register(HttpConfiguration config)
    {
      // Web API configuration and services

      // Web API routes
      ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

      builder.Namespace = "AccountsReceivableWebService";
      builder.EntitySet<Receipt>("Receipts");
      builder.EntityType<ReceiptLine>().Collection.Function("GetCount").Returns<int>();

      config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: null,
            model: builder.GetEdmModel());

    }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web.Http;
使用AccountsReceivebleWebService.Models;
使用System.Web.OData.Builder;
使用System.Web.OData.Extensions;
命名空间帐户ReceiveableWebService
{
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
//Web API配置和服务
//Web API路由
ODataConventionModelBuilder=新ODataConventionModelBuilder();
builder.Namespace=“AccountsReceivableWebService”;
建造商实体集(“收据”);
builder.EntityType().Collection.Function(“GetCount”).Returns();
config.MapODataServiceRoute(
routeName:“ODataRoute”,
routePrefix:null,
模型:builder.GetEdmModel());
}
}
}
元数据:

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
  <edmx:DataServices>
    <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="AccountsReceivableWebService.Models">
      <EntityType Name="Receipt">
        <Key>
          <PropertyRef Name="ReceiptId"/>
        </Key>
        <Property Name="ReceiptId" Type="Edm.String" Nullable="false"/>
        <Property Name="comments" Type="Edm.String"/>
        <Property Name="remitter" Type="Edm.String"/>
        <Property Name="ReceiptLineId" Type="Edm.String"/>
        <NavigationProperty Name="ReceiptLines" Type="Collection(AccountsReceivableWebService.Models.ReceiptLine)" ContainsTarget="true"/>
      </EntityType>
      <EntityType Name="ReceiptLine">
        <Key>
          <PropertyRef Name="ReceiptLineId"/>
        </Key>
        <Property Name="ReceiptLineId" Type="Edm.String" Nullable="false"/>
        <Property Name="Comments" Type="Edm.String"/>
        <Property Name="FiscalYear" Type="Edm.String"/>
        <Property Name="CostCenter" Type="Edm.String"/>
        <Property Name="object" Type="Edm.String"/>
        <Property Name="Amount" Type="Edm.String"/>
        <Property Name="Function" Type="Edm.String"/>
      </EntityType>
    </Schema>
    <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="AccountsReceivableWebService">
      <Function Name="GetCount" IsBound="true">
      <Parameter Name="bindingParameter" Type="Collection(AccountsReceivableWebService.Models.ReceiptLine)"/>
      <ReturnType Type="Edm.Int32" Nullable="false"/>
      </Function>
      <EntityContainer Name="Container">
      <EntitySet Name="Receipts" EntityType="AccountsReceivableWebService.Models.Receipt"/>
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>