Skip to main content
 首页 » 编程设计

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

2024年01月02日38del

我有以下模型:

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

Maximum serialization depth exceeded (does the object being serialized have a circular reference?).

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

我看不出哪里出了问题?
没有循环引用?

请您参考如下方法:

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

正如@chebum 正确指出的那样,问题实际上在于我首先使用 nHibernate 拉动使用该模型的实体。
这意味着我的 Competitor 对象上的 IEnumerable< CompetitorBest > 实际上是 类型 NHibernate.Collection.Generic.PersistentGenericBag

正如@chebum 在评论中正确指出的那样,这将引用原始对象,因此创建了一个循环引用。

而不是创建一个 mongodb 类映射(这是我可能应该做的..随时回答)这是我现在所做的让事情正常工作。

将我的 Competitor 类更改为:

public class Competitor 
{ 
    private IList<CompetitorBest> _competitorBests; 
 
    //other properties 
 
    public virtual IEnumerable<CompetitorBest> CompetitorBests 
    { 
        get { return _competitorBests.ToArray(); } 
        set { } 
    } 
} 

然后在我的 nHibernate Class Map 中:

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

同样,我确信有更好的方法(也许使用 mongodb 类映射??) 但我已经添加了这个,因为它对我有用……现在。