1

我正在尝试从实体框架 4 edmx 生成的 MVC 4 web api ApiController 对象返回,并带有 accept:json/application。

问题是 json 格式化程序还返回导航属性,我不想返回(我只想返回原始属性)。

所以我查看了生成的实体框架4代码,在导航属性中,只有XmlIgnoreAttribute和SoapIgnoreAttribute,而我需要JsonIgnoreAttribute。

我无法更改生成的代码,因为它将在 edmx 的下一次更改中被覆盖,那么如何配置将使用 JsonIgnoreAttribute 生成模型生成?

谢谢

4

2 回答 2

3

虽然我不知道这是错误还是不受支持的功能,但我建议您定义视图模型并让您的 API 控制器操作返回视图模型而不是 EF 自动生成的域模型。视图模型显然只包含您想要公开的属性。单个视图模型可以表示多个域模型的聚合。所以不要依赖任何 XmlIgnore、SoapIgnore、JsonIgnore、... 属性。依靠您的视图模型。

于 2012-09-23T14:27:53.803 回答
2

好的,我知道该怎么做。我们需要以这种方式使用自定义 DefaultContractResolver:

public class ExcludeEntityKeyContractResolver : DefaultContractResolver
{
    private static Type mCollectionType = typeof(System.Data.Objects.DataClasses.RelatedEnd);

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var members = GetSerializableMembers(type);

        IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
        IList<JsonProperty> serializeProperties = new List<JsonProperty>();

        for (int i = 0; i < properties.Count; i++)
        {
            var memberInfo = members.Find(p => p.Name == properties[i].PropertyName);
            if (!memberInfo.GetCustomAttributes(false).Any(a => a is SoapIgnoreAttribute) && properties[i].PropertyType != typeof(System.Data.EntityKey))
            {
                serializeProperties.Add(properties[i]);
            }
        }
        return serializeProperties;
    }
}

在 Global.asax 中:

        JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
        serializerSettings.ContractResolver = new ExcludeEntityKeyContractResolver();
        var jsonMediaTypeFormatter = new JsonMediaTypeFormatter();
        jsonMediaTypeFormatter.SerializerSettings = serializerSettings;
        GlobalConfiguration.Configuration.Formatters.Insert(0, jsonMediaTypeFormatter);

并且不用担心性能,因为在整个应用程序持续时间内,每种类型只会调用一次 CreateProperties :)

于 2012-09-23T14:56:45.940 回答