1

私は自分の仕事の問題を知るために何日も費やしましたが、運がありませんでした。

  1. 新しいMVC4WebAPIプロジェクトを作成しました。
  2. データベースにEF5を追加します([プロジェクト]>[追加]>[ADO.NETエンティティデータモデル]>[Azure SQLにあるデータベースから作成])。
  3. 以下のように2つのテーブルをedmxに追加します。また、2つの*.ttファイルがエンティティとモデルクラスを正常に生成します。

ここに画像の説明を入力してください

ブレークポイント(結果)がクエリ結果を正常に提供していることがわかります。 しかし、jsonはエラーメッセージなしで異常なストリームを提供します。(つまり、http://localhost:41813/api/sheet/157ダウンロードできない「157」を返します。通常、「157.json」はダウンロードされます)

ここに画像の説明を入力してください

結果のプロパティを手作りのPOCOスタイルのクラスにコピーしましたが、機能します。

私の問題は何ですか?生成されたモデルクラスを使用して、Jsonを介してデータを送信することはできません。結果のブレークポイントの後にエラーメッセージとデバッグステップがないため、問題はほとんど見つかりません。

4

2 に答える 2

6

シリアル化が失敗する理由は、ナビゲーションプロパティです。シリアライザーがオブジェクトグラフをウォークしようとしている間、循環依存が発生します。

単純なサンプルを機能させるには、いくつかの方法があります。

  1. からナビゲーションプロパティ を削除するSheetSheetDetail
  2. Navigationプロパティを省略してViewModelクラスでオブジェクトをラップします Sheet
  3. でメタデータクラスを作成し、JsonIgnoreAttributeそれを部分クラスでエンティティにアタッチします。MetadataTypeAttribute

ここで、3番目のソリューションのサンプルを見つけることができます(サンプルは、正確なデータ型がわからないため、いくつかの仮定を行っています)。

public class SheetDetailSerializationMetadata
{
    [JsonIgnore]
    public Sheet Sheet { get; set; }
}

[MetadataType(typeof(SheetDetailSerializationMetadata))]
public partial class SheetDetail
{ 
}
于 2012-10-25T07:00:58.450 に答える
0

@danludwigのコメントとして、http: //www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serializationは私の問題に関するすべての答えを提供します。

Global.asaxに以下のコードを追加すると、問題が解決します。

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.All;
于 2014-02-16T13:44:52.930 に答える