将集合映射到子文档 - 超出最大序列化深度(被序列化的对象是否具有循环引用?)

时间:2012-06-28 12:34:57

标签: c# mongodb mongodb-.net-driver

我有以下型号:

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实例时,出现以下错误:

  

超出了最大序列化深度(被序列化的对象是否具有循环引用?)。

我正在使用自动化(即 - 未设置任何类映射)

我看不出有什么不对的?
没有循环引用?

1 个答案:

答案 0 :(得分:0)

确定, 我将此作为答案提交,主要是因为它有效 - 即允许我根据需要保存文档。

正如@chebum正确指出的那样,问题实际上是因为我首先使用nHibernate使用该模型拉动实体。
这意味着我的 IEnumerable&lt;竞争对手对象上的CompetitorBest&gt; 实际上是类型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类映射?) 但我已经添加了这个,因为它适用于我......现在。