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