无法序列化为增量<&燃气轮机;在OData控制器中

无法序列化为增量<&燃气轮机;在OData控制器中,odata,breeze,asp.net-web-api2,http-patch,Odata,Breeze,Asp.net Web Api2,Http Patch,我正在实现一个ODataController。出于与以下兼容的原因,它是OData V3: 在中间,我想在例子中实现合并/补丁: [AcceptVerbs("PATCH", "MERGE")] public IHttpActionResult Patch([FromODataUri] int key, Delta<BOOffer> delta) { ... 我应该注册这个格式化程序吗?它不应该是自动的吗?如果我需要手动注册,如何注册 如果我将输入参数表单Delta更改为BO

我正在实现一个
ODataController
。出于与以下兼容的原因,它是OData V3:

在中间,我想在例子中实现合并/补丁:

[AcceptVerbs("PATCH", "MERGE")]
public IHttpActionResult Patch([FromODataUri] int key, Delta<BOOffer> delta)
{
    ...
我应该注册这个格式化程序吗?它不应该是自动的吗?如果我需要手动注册,如何注册

如果我将输入参数表单
Delta
更改为
BOOffer
,则会调用该方法,但由于只发送更改的属性,因此我无法使用该方法

我在app_start中配置控制器,如下所示:

System.Web.Http.OData.Builder.ODataConventionModelBuilder builderV3 = new System.Web.Http.OData.Builder.ODataConventionModelBuilder();
var entitySetConfigV3 = builderV3.EntitySet<BOOffer>("Offers");
entitySetConfigV3.EntityType.HasKey(o => o.ID);

config.Routes.MapODataServiceRoute(
    routeName: "odata/v3", 
    routePrefix: "odata/v3",
    model: builderV3.GetEdmModel(),
    batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
System.Web.Http.OData.Builder.ODataConventionModelBuilder builderV3=new System.Web.Http.OData.Builder.ODataConventionModelBuilder();
var entitySetConfigV3=builderV3.EntitySet(“提供”);
entitySetConfigV3.EntityType.HasKey(o=>o.ID);
config.Routes.MapODataServiceRoute(
路由名称:“odata/v3”,
routePrefix:“odata/v3”,
模型:builderV3.GetEdmModel(),
batchHandler:new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

原因是在项目中引用了
System.Web.Http.OData
(odatav3)和
System.Web.OData
(odatav4),并且混淆了引用

System.Web.Http.OData.Formatter.ODataMediaTypeFormatter
未配置为能够序列化到
System.Web.OData.Delta

使用to
System.Web.Http.OData.Delta
按预期工作

在一个项目中引用不同的OData版本时要小心

JsonMediaTypeFormatter
    CanReadType: True
    CanWriteType: True
    Base: BaseJsonMediaTypeFormatter
    Media Types: application/json, text/json
XmlMediaTypeFormatter
    CanReadType: True
    CanWriteType: True
    Base: MediaTypeFormatter
    Media Types: application/xml, text/xml
FormUrlEncodedMediaTypeFormatter
    CanReadType: False
    CanWriteType: False
    Base: MediaTypeFormatter
    Media Types: application/x-www-form-urlencoded
JQueryMvcFormUrlEncodedFormatter
    CanReadType: True
    CanWriteType: False
    Base: FormUrlEncodedMediaTypeFormatter
    Media Types: application/x-www-form-urlencoded
System.Web.Http.OData.Builder.ODataConventionModelBuilder builderV3 = new System.Web.Http.OData.Builder.ODataConventionModelBuilder();
var entitySetConfigV3 = builderV3.EntitySet<BOOffer>("Offers");
entitySetConfigV3.EntityType.HasKey(o => o.ID);

config.Routes.MapODataServiceRoute(
    routeName: "odata/v3", 
    routePrefix: "odata/v3",
    model: builderV3.GetEdmModel(),
    batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));