1

機器のリストを提供する DbDataController があります。

    public IQueryable<BettrFit.Models.Equipment> GetEquipment() {
        var q= DbContext.EquipmentSet.OrderBy(e => e.Name);
        return q;
    }

私の足場ビューでは、すべて問題ないように見えます。

ただし、Equipment には EquipmentType の HashSet メンバーが含まれています。このタイプをビューに表示し、(複数選択リストを介して) EquipmentType コレクションの Equipment にデータを追加できるようにしたいと考えています。

しかし、linq クエリに「EquipmentType」を含めようとすると、シリアル化中に失敗します。

    public IQueryable<BettrFit.Models.Equipment> GetEquipment() {
        var q= DbContext.EquipmentSet.Include("EquipmentType").OrderBy(e => e.Name);
        return q;
    }

「EquipmentType タイプのオブジェクト グラフにはサイクルが含まれており、リファレンス トラッキングが無効になっている場合はシリアル化できません」

「参照のバックトラッキング」を有効にするにはどうすればよいですか?

おそらく問題は、EquipmentType が HashSet を介してバックリンクしていることでしょうか? しかし、クエリには .include("EquipmentType.Equipment") を使用しません。それで大丈夫なはずです。

Upshot はどのようにモデルを生成していますか? EquipmentViewModel.js ファイルしか見つかりませんが、これにはモデル メンバーが含まれていません。

ここに私のモデルクラスがあります:

public class Equipment
{
    public Equipment()
    {
        this.Exercise = new HashSet<Exercise>();
        this.EquipmentType = new HashSet<EquipmentType>();
        this.UserDetails = new HashSet<UserDetails>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Picture { get; set; }
    public string Link { get; set; }
    public string Producer { get; set; }
    public string Video { get; set; }

    public virtual ICollection<EquipmentType> EquipmentType { get; set; }
    public virtual ICollection<UserDetails> UserDetails { get; set; }
}
public class EquipmentType
{
    public EquipmentType()
    {
        this.Equipment = new HashSet<Equipment>();
        this.UserDetails = new HashSet<UserDetails>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Equipment> Equipment { get; set; }
    public virtual ICollection<UserDetails> UserDetails { get; set; }
}
4

4 に答える 4

2

ナビゲーションプロパティの1つを装飾してみてください[IgnoreDataMember]

[IgnoreDataMember]
public virtual ICollection<Equipment> Equipment { get; set; } 
于 2012-03-26T16:12:39.053 に答える
0

upshotによって生成されたモデルは、ページ自体にあります。インデックスビューには、UpshotContext使用されているHTMLヘルパーが表示され(最新のSPAバージョンを使用している場合)、dataSourceとモデルタイプが指定されています。

その後、ページがブラウザでレンダリングされると、このヘルパーコードは実際のモデル定義に置き換えられます。これを確認するには、ブラウザでページのソースコードを表示し、<script>で始まるタグを検索してくださいupshot.dataSources = upshot.dataSources || {};

upshotがクライアント側モデルを生成する方法の詳細については、こちらを確認してください。「参照のバックトラック」については、わかりません:)

于 2012-03-21T13:27:10.227 に答える
0

循環後方参照を解決するには、IgnoreDataMember 属性を使用できます。または、DbDataController からデータを返す前に、後方参照を NULL に設定できます。

別の質問であなたの問題に対する実用的な解決策を投稿しましたが、Entity Framework Code First を使用しています。 https://stackoverflow.com/a/10010695/1226140

ここでは、クライアント側モデルを手動で生成する方法を示し、データを好きなようにマッピングできるようにします

于 2012-04-05T07:10:19.377 に答える
0

私は理解しました-循環参照の問題を部分的に解決する方法。

クエリされたコレクションを ( Include() を使用して) 繰り返し処理し、親への後方参照を NULL に設定しました。これは、そうでなければサーバー上で既に壊れているシリアライゼーションの問題に対して機能しました。

唯一の問題は、データ エンティティの更新です。参照されるエンティティ コレクションの配列が静的であるため、失敗します...

于 2012-03-21T19:16:34.727 に答える