c# - EF 核心关系
问题描述
我在建立人际关系时遇到问题。
我希望每个Post
人都有一个 User和许多Comments
. 每个User
都有很多Comments
和Posts
(如果我想随时过滤每个用户的评论和帖子)。然后每个Comment
to 都有一个 User 和 Post
问题是当我为数据库播种时
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);
}
解决方案
您正在尝试 JSONify 一个 JSON 字符串:
return Json(Newtonsoft.Json.JsonConvert.SerializeObject(posts));
你需要让框架为你做这件事,而不是:
return Json(posts);
推荐阅读
- c# - 如何退出xml文件
- highcharts - 如何在不重叠的情况下显示所有时间线 Highcharts 数据?
- r - 计算年化内部收益率
- javascript - 为字符串中的相同元素着色
- perl - 防止在具有原始数据库密码的 perl 脚本中的日志中打印异常
- excel - 不当使用财产
- microsoft-graph-api - Microsoft Graph API - 查询班次时出现未知错误
- asp.net-mvc - Syncfusion Treeview 未在 ASP.Net MVC5 中呈现
- java - 如何每小时强制触发分布式 GC(System.gc())?
- python - 如何合并 Pandas 中的列?