2

私は次のモデルを持っています:

public class Competitor
{
    public virtual int CompetitorId { get; set; }
    public virtual string TeamName { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual DateTime BirthDate { get; set; }

    public virtual IEnumerable<CompetitorBest> CompetitorBests { get; set; }
}


public class CompetitorBest
{
    public virtual int ResultId { get; set; }
    public virtual string BestTypeName { get; set; }
    public virtual string IndoorOutdoor { get; set; }
    public virtual int Season { get; set; }
    public virtual string DisciplineName { get; set; }
    public virtual string ResultValue { get; set; }
}

それをMongoDBインスタンスに保存しようとすると、次のエラーが発生します。

最大シリアル化深度を超えました(シリアル化されるオブジェクトに循環参照がありますか?)。

自動マッピングを使用しています(つまり、クラスマッピングを設定していません)

何が悪いのかわかりませんか?
循環参照はありませんか?

4

1 に答える 1

0

わかりました。これを回答として送信します。これは主に、機能するためです。つまり、必要に応じてドキュメントを保存できます。

@chebumが正しく指摘しているように、問題は実際には、最初にnHibernateを使用してそのモデルを使用してエンティティをプルしているという事実にあります。
これは、競合他社オブジェクトのIEnumerable <CompetitorBest>が、実際にはNHibernate.Collection.Generic.PersistentGenericBag型であることを意味します。

コメントで@chebumによって正しく指摘されているように、これには元のオブジェクトへの参照があるため、循環参照が作成されます。

mongodbクラスマップを作成するのではなく(これはおそらく私がすべきことです。お気軽に答えてください)、これは私が今のところ物事を機能させるためにしたことです。

競合他社のクラスを次のように変更しました。

public class Competitor
{
    private IList<CompetitorBest> _competitorBests;

    //other properties

    public virtual IEnumerable<CompetitorBest> CompetitorBests
    {
        get { return _competitorBests.ToArray(); }
        set { }
    }
}

次に、私のnHibernateクラスマップで:

HasMany(x => x.CompetitorBests)
    .Not.LazyLoad()
    .Access.CamelCaseField(Prefix.Underscore)
    .Inverse()
    .AsBag()
    .KeyColumn("competitorId");

繰り返しになりますが、それを行うためのより良い方法があると確信しています(おそらく、mongodbクラスマッピングを使用しますか??)しかし、私にとってはうまくいくので、これを追加しました...今のところ。

于 2012-06-28T14:57:12.950 に答える