如果我为OData创建自定义媒体类型格式化程序,则序列化程序会忽略我的流畅API调用"忽略"某些属性。
假设我有以下OData配置:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var builder = new ODataConventionModelBuilder();
var products = builder.EntitySet<Product>("Products");
products.EntityType.Ignore(e => e.Name); // IGNORE NAME FIELD
config.EnableQuerySupport();
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
}
}
我已指定忽略Name
属性。这一切都很好,Name
属性被忽略。
如果我将以下代码添加到WebApiConfig
类 - 直接使用默认的OData序列化器/反序列化器实例 - 我的Name
属性不再被忽略:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var builder = new ODataConventionModelBuilder();
var products = builder.EntitySet<Product>("Products");
products.EntityType.Ignore(e => e.Name); // IGNORE NAME FIELD
config.EnableQuerySupport();
// INSERT CUSTOM FORMATTERS
config.Formatters.InsertRange(0,
ODataMediaTypeFormatters.Create(
DefaultODataSerializerProvider.Instance,
DefaultODataDeserializerProvider.Instance));
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
}
}
当然,如果我实现自己的ODataSerializerProvider
等,也会出现相同的结果,但出于示例的目的,我觉得值得注意的是,这甚至发生在默认实例上。
如果我使用以下属性&#34;忽略&#34;很荣幸:
public class Product
{
public int Id { get; set; }
[IgnoreDataMember]
public string Name { get; set; }
}
但首先我不喜欢这种方法,其次我无法实际访问某些类来添加属性。
有什么想法吗?
答案 0 :(得分:3)
找到答案。
而不是:
config.Formatters.InsertRange(0,
ODataMediaTypeFormatters.Create(
DefaultODataSerializerProvider.Instance,
DefaultODataDeserializerProvider.Instance));
使用:
config.Formatters.Clear();
config.Formatters.AddRange(
ODataMediaTypeFormatters.Create(
DefaultODataSerializerProvider.Instance,
DefaultODataDeserializerProvider.Instance));