C# asp.net web api中对@odata.bind的支持(发布期间链接到现有实体)

C# asp.net web api中对@odata.bind的支持(发布期间链接到现有实体),c#,odata,asp.net-web-api-odata,C#,Odata,Asp.net Web Api Odata,我在从WCF数据服务迁移到web api odata v4时遇到了一段非常困难的时间。我被困在以下问题上: odata web api似乎不支持@odata.bind。 我找到了以下链接: 有人建议实现自己的ODataEntityDeserializer派生类,如下所示: public class ExtendedODataEntityDeserializer : ODataEntityDeserializer { public ExtendedODataEntityDeserializ

我在从WCF数据服务迁移到web api odata v4时遇到了一段非常困难的时间。我被困在以下问题上:

odata web api似乎不支持@odata.bind。

我找到了以下链接: 有人建议实现自己的
ODataEntityDeserializer
派生类,如下所示:

public class ExtendedODataEntityDeserializer : ODataEntityDeserializer
{
    public ExtendedODataEntityDeserializer(ODataDeserializerProvider deserializerProvider) : base(deserializerProvider)
    {
    }

    public override void ApplyNavigationProperty(
        object entityResource, 
        ODataNavigationLinkWithItems navigationLinkWrapper, 
        IEdmEntityTypeReference entityType, 
        ODataDeserializerContext readContext)
    {
        base.ApplyNavigationProperty(entityResource, navigationLinkWrapper, entityType, readContext);

        foreach (var childItem in navigationLinkWrapper.NestedItems)
        {
            var entityReferenceLink = childItem as ODataEntityReferenceLinkBase;

            if (entityReferenceLink != null)
            {
                var navigationPropertyName = navigationLinkWrapper.NavigationLink.Name;
                Uri referencedEntityUrl = entityReferenceLink.EntityReferenceLink.Url;

                if (!referencedEntityUrl.IsAbsoluteUri)
                {
                    referencedEntityUrl = new Uri(readContext.Request.RequestUri, referencedEntityUrl);
                }

                var linkedEntities = (Model.LinkedEntityCollection)entityResource;
                linkedEntities.Add(navigationPropertyName, referencedEntityUrl);
            }
        }
    }
}
LinkedEntityCollection是用作字典的实体类的基类(
MyEntity:LinkedEntityCollection
实现很简单)

在http配置中注册:

public static void Register(HttpConfiguration config)
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();

    // registering entities: builder.EntitySet<T>("EntityName") ...

    ODataBatchHandler batchHandler = new DefaultODataBatchHandler(new HttpServer(config));
    batchHandler.MessageQuotas.MaxOperationsPerChangeset = 10;
    batchHandler.MessageQuotas.MaxPartsPerBatch = 10;

    var odataFormatters = ODataMediaTypeFormatters.Create(DefaultODataSerializerProvider.Instance, ExtendedODataDeserializerProvider.Instance);

    config.Formatters.Clear();
    config.Formatters.AddRange(odataFormatters);

    config.MapODataServiceRoute(routeName: "Central", routePrefix: "Odata", model: builder.GetEdmModel(), batchHandler: batchHandler);
}
那么剩下的问题是:我们什么时候在asp.net webapi odata中获得@odata.bind支持

试图回答

那么剩下的问题是:我们什么时候在asp.net webapi odata中获得@odata.bind支持

vnext回购协议中似乎有一个与此相关的功能。然而,这一问题的影响很小。
因此,无法知道何时将实施此功能。

谢谢。如果aps.net web api odata团队的人能够就此发表声明,那就太好了。我发现这个特性非常相关,尤其是当您必须迁移现有的WCF数据时Service@Jeldrik我认为,如果你提出新的问题说明你的担忧,他们会在GitHub回购协议中做出回应。祝你好运!再次感谢。github()上已经存在一个公开问题,asp.net web api odata团队几乎没有响应。这项功能似乎计划在V5.6版推出,但目前推迟到V5.7版(但我仍持怀疑态度)。我有自己的定制serialier,想注册它。我正在使用config.Formatters.InsertRange(0,mycustomformatter)。但是,如果在此之前我没有清除(),它将不起作用。我向您提出的问题是:在添加格式化程序之前,您是否仍在清除?或者您是否找到了其他方法?我仍在按上述方式使用它(清除,然后添加格式化程序)。从那时起,我所做的唯一更改是,我还将JsonMediaTypeFormatter和XmlMediaTypeFormatter添加到Formatter集合中。既然这对我有效,我就不再寻找替代方案了。
public static void Register(HttpConfiguration config)
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();

    // registering entities: builder.EntitySet<T>("EntityName") ...

    ODataBatchHandler batchHandler = new DefaultODataBatchHandler(new HttpServer(config));
    batchHandler.MessageQuotas.MaxOperationsPerChangeset = 10;
    batchHandler.MessageQuotas.MaxPartsPerBatch = 10;

    var odataFormatters = ODataMediaTypeFormatters.Create(DefaultODataSerializerProvider.Instance, ExtendedODataDeserializerProvider.Instance);

    config.Formatters.Clear();
    config.Formatters.AddRange(odataFormatters);

    config.MapODataServiceRoute(routeName: "Central", routePrefix: "Odata", model: builder.GetEdmModel(), batchHandler: batchHandler);
}
public override ODataDeserializer GetODataDeserializer(
     Microsoft.OData.Edm.IEdmModel model, 
     Type type,     
     System.Net.Http.HttpRequestMessage request)
{
    if (type == typeof(ODataActionParameters) || 
        type == typeof(ODataUntypedActionParameters) || 
        type == typeof(Uri))
    {
        return base.GetODataDeserializer(model, type, request);
    }

    return new ExtendedODataEntityDeserializer(DefaultODataDeserializerProvider.Instance);
 }