在Program.cs 中添加一行代码
builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; });
就可以完美解决这个问题
最近有想开发一个个人博客系统,于是我创建了一个两个简单的实体类
Article.cs
public class Article : FullAuditedEntity<Guid>{ public Article(Guid id, string title, string? content, string coverImage, string classifyName,Guid classifyId, ArticleState state = ArticleState.Auditing, int collectCount = 0, int shareCount = 0, int browseCount = 0, int supportCount = 0) { Title = title; ClassifyId = classifyId; BrowseCount = browseCount; SupportCount = supportCount; CollectCount = collectCount; ShareCount = shareCount; Content = content; CoverImage = coverImage; State = state; ClassifyName = classifyName; Id = id; }
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public override Guid Id { get; protected set; }
/// <summary> /// 文章标题 /// </summary> [StringLength(100)] public string Title { get; protected set; }
/// <summary> /// 文章分类Id /// </summary> public Guid? ClassifyId { get; protected set; }
//public string ClassifyName { get; protected set; } public Classify? Classify { get; set; }
/// <summary> /// 浏览量 /// </summary> public int BrowseCount { get; protected set; }
/// <summary> /// 点赞数量 /// </summary> public int SupportCount { get; protected set; }
/// <summary> /// 收藏数量 /// </summary> public int CollectCount { get; protected set; }
/// <summary> /// 分享数量 /// </summary> public int ShareCount { get; protected set; }
/// <summary> /// 文章内容 /// </summary>
public string? Content { get; protected set; }
/// <summary> /// 文章路径 /// </summary> /// <value></value> // [StringLength(64)] // public string? ContentPath { get; set; }
/// <summary> /// 封面图 /// </summary> [StringLength(100)] public string CoverImage { get; protected set; }
/// <summary> /// 状态,0=待审核,1=审核中,2=审核通过,3=审核不通过 /// </summary> public ArticleState State { get; protected set; } }
Classify.cs
public class Classify : FullAuditedEntity<Guid>{ [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public override Guid Id { get; protected set; }
/// <summary> /// 分类名称 /// </summary> [StringLength(32)] public string Name { get; set; }
/// <summary> /// 是否显示在导航栏 /// </summary> public bool IsShowNav { get; set; } = true;
public List<Article> Articles { get; set; }
protected Classify() { }
public Classify AddArticle(Guid id, string title, string? content, string coverImage,string classifyName) { if (Articles == null) Articles = new List<Article>(); var article = new Article(id, title, content, coverImage,classifyName,this.Id); Articles.Add(article); return this; }
并且在DbContext中也进行了一对多的关系配置
builder.Entity<Article>() .HasOne(i => i.Classify) .WithMany(i => i.Articles) .HasForeignKey(i => i.ClassifyId) .OnDelete(DeleteBehavior.ClientSetNull); //级联删除时给外键赋空值
然后我查询article的时候把classify给inclue进来,这时就会报错抛异常
System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.
这个异常的原因是System.Text.Json默认是不支持这样的嵌套的,因为我Article里查询了classify,而classify里又有List
在Program.cs 中添加一行代码
builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; });
就可以完美解决这个问题