0

私は Entity Framework を初めて使用するので、これが有効な質問でない場合はお詫びします。

数週間前に .NET Web Api の使用を開始しましたが、より複雑なエンティティを処理する必要がある場合、json シリアル化で問題が発生します。いくつかの調査の後、次のようなさまざまなアプローチを見つけました。

Global.asax.cs

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling= Newtonsoft.Json.ReferenceLoopHandling.Ignore;

また

シリアル化したくないプロパティ (context.designer.cs ファイル内) ごとに、次を追加します。

[JsonIgnore]

最初の方法はうまくいかなかったので、[JsonIgnore] 属性を使用しました。

残念ながら、ときどき Entity Framework のコンテキスト デザインを変更する必要があり、それらの変更を保存するとすぐに、シリアル化したくないプロパティに追加した属性が失われます。

質問は次のとおりです: JsonIgnore を特定のプロパティに永続的に設定する方法はありますか? または、Entity Framework が特定のプロパティまたはクラスの変更をオーバーライドしないようにする方法はありますか?

それとも... JsonIgnoreが最善のアプローチですか?

ありがとう

編集:

シリアル化スタック トレース:

{"メッセージ":"エラーが発生しました。","ExceptionMessage":"'ObjectContent`1' タイプは、コンテンツ タイプ 'application/json; charset=utf-8' の応答本文をシリアル化できませんでした。","ExceptionType ":"System.InvalidOperationException","StackTrace":null,"InnerException":{"メッセージ":"エラーが発生しました。","ExceptionMessage":"タイプ 'Pathfinders.Data.Natural_Person' で検出された自己参照ループ。パス '[0].Natural_Persons[0].Gender.Natural_Persons'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":" Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object値、JsonProperty プロパティ、JsonContract コントラクト、JsonContainerContract containerContract、JsonProperty containerProperty)\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList (JsonWriter ライター、IWrappedCollection 値、JsonArrayContract コントラクト、JsonProperty メンバー、JsonContainerContract collectionContract、JsonProperty containerProperty) で\r\n Newtonsoft.Json で.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter ライター、Object 値、JsonContract 値Contract、JsonProperty メンバー、JsonContainerContract コンテナー契約、JsonProperty コンテナーProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter ライター、Object 値、JsonObjectContract 契約、JsonPropertyメンバー、JsonContainerContract collectionContract、JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter ライター、Object 値、JsonContract 値Contract、JsonProperty メンバー、JsonContainerContract containerContract、JsonProperty コンテナーProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter ライター、Object 値、JsonObjectContract 契約、JsonProperty メンバー、JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter .SerializeList(JsonWriter ライター、IWrappedCollection 値、JsonArrayContract コントラクト、JsonProperty メンバー、JsonContainerContract collectionContract、JsonProperty containerProperty)\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter ライター、オブジェクト値、JsonContract valueContract、JsonProperty メンバー、JsonContainerContract containerContract、JsonProperty containerProperty)\r\n Newtonsoft.Json.Serialization. JsonSerializerInternalWriter.SerializeObject(JsonWriter ライター、オブジェクト値、JsonObjectContract 契約、JsonProperty メンバー、JsonContainerContract コレクション契約、JsonProperty コンテナーProperty)\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter ライター、オブジェクト値、JsonContract 値契約、JsonProperty メンバー、JsonContainerContract でcontainerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter ライター、IWrappedCollection 値、JsonArrayContract コントラクト、JsonProperty メンバー、JsonContainerContract collectionContract、JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter ライター、オブジェクト値、JsonContract valueContract、JsonProperty メンバー、JsonContainerContract containerContract、 System. Net.Http.Formatting.JsonMediaTypeFormatter.<>c_JsonProperty containerProperty)\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter ライター、オブジェクト値、JsonContract valueContract、JsonProperty メンバー、JsonContainerContract containerContract、JsonProperty containerProperty) で\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize で(JsonWriter jsonWriter, Object value)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c_JsonProperty containerProperty)\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter ライター、オブジェクト値、JsonContract valueContract、JsonProperty メンバー、JsonContainerContract containerContract、JsonProperty containerProperty) で\r\n Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize で(JsonWriter jsonWriter, Object value)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c_Serialize(JsonWriter jsonWriter, Object value)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c_Serialize(JsonWriter jsonWriter, Object value)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c_DisplayClassd.b _c()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action アクション、CancellationToken トークン)"}}

4

0 に答える 0