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 回答