我在构建我的人际关系时遇到了问题。
我希望每个Post
都有一个用户和多个Comments
。每个User
都有Comments
和Posts
(如果我想随时过滤每个用户的评论和帖子)。然后每个Comment
都有一个用户和帖子
问题是当我播种db
时if (!ctx.Posts.Any()) {
Tag tag = new Tag() {
Name = "Test1"
};
User user = new User() {
UserName = "TestUser",
Email = "test1@test1.bg",
Password = Extensions.PasswordHash("abv123456", config["AppSettings:PasswordSalt"]),
Role = UserRoles.Member
};
ctx.Users.Add(user);
Post post = new Post() {
Title = "Test Post",
Description = "Description post test",
Likes = 5,
User = user,
CreateOn = DateTime.Now,
LastEditOn = DateTime.Now
};
PostTag posttags = new PostTag() {
Post = post,
Tag = tag
};
ctx.PostTag.Add(posttags);
ctx.SaveChanges();
};
如果我想获取与相关User
public IActionResult GetAllPost() {
var posts = _ctx.Posts
.Include(u => u.User)
.ToList();
return Json(Newtonsoft.Json.JsonConvert.SerializeObject(posts));
}
我得到 Newtonsoft.Json.JsonSerializationException:使用类型' Blog.Data.Entities.Post'检测到自引用循环。路径' [0] .User.Posts'。
在我的Configure
方法中,我忽略了它
services.AddMvc().AddJsonOptions(opts => {
opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
OnModelCreating()
protected override void OnModelCreating(ModelBuilder modelBuilder) {
// set unique email and username
modelBuilder.Entity<User>()
.HasIndex(u => new { u.Email, u.UserName })
.IsUnique();
// set unique tag name
modelBuilder.Entity<Tag>()
.HasIndex(t => t.Name)
.IsUnique();
modelBuilder.Entity<Post>()
.HasOne(p => p.User)
.WithMany(u => u.Posts);
modelBuilder.Entity<User>()
.HasMany(u => u.Comments)
.WithOne(u => u.User);
// post tag many-to-many rel
modelBuilder.Entity<PostTag>()
.HasKey(pt => new { pt.PostUID, pt.TagUID });
modelBuilder.Entity<PostTag>()
.HasOne(pt => pt.Post)
.WithMany(p => p.PostTags)
.HasForeignKey(pt => pt.PostUID);
modelBuilder.Entity<PostTag>()
.HasOne(pt => pt.Tag)
.WithMany(p => p.PostTags)
.HasForeignKey(pt => pt.TagUID);
}
答案 0 :(得分:2)
您正在尝试JSON化JSON字符串:
return Json(Newtonsoft.Json.JsonConvert.SerializeObject(posts));
你需要让框架为你做,而不是:
return Json(posts);
答案 1 :(得分:0)
问题是您已经配置了服务,但是您没有使用该服务。您正在使用Newtonsoft Json转换器的静态引用。您需要使用框架提供的服务(它应该在从控制器返回模型时自动使用它),或者将配置应用于您正在使用的Newtonsoft Json转换器调用。