1

エンティティ フレームワーク 4 edmx から生成された MVC 4 Web API ApiController オブジェクトから、accept:json/application を使用して返そうとしています。

問題は、json フォーマッタが、返したくないナビゲーション プロパティも返すことです (プリミティブ プロパティのみを返したい)。

そこで、Navigation Properties で生成されたエンティティ フレームワーク 4 コードを調べたところ、JsonIgnoreAttribute が必要ですが、XmlIgnoreAttribute と SoapIgnoreAttribute しかありません。

生成されたコードは次の 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 は、アプリケーションの全期間にわたってすべてのタイプに対して 1 回だけ呼び出されるため、パフォーマンスについて心配する必要はありません :)

于 2012-09-23T14:56:45.940 に答える