C# EF核心关系

C# EF核心关系,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我在建立人际关系方面有问题 我希望每个帖子都有一个用户和许多评论。每个用户都有许多评论和帖子(如果我想随时过滤每个用户的评论和帖子)。然后每个Commentto都有一个用户和一篇帖子 问题是当我为db播种时 if (!ctx.Posts.Any()) { Tag tag = new Tag() { Name = "Test1" }; User user = new User() { UserName = "TestUser",

我在建立人际关系方面有问题

我希望每个
帖子
都有一个用户和许多
评论
。每个
用户
都有许多
评论
帖子
(如果我想随时过滤每个用户的评论和帖子)。然后每个
Comment
to都有一个用户和一篇帖子

问题是当我为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();
};
如果我想用相关的
用户

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()

模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder){
//设置唯一的电子邮件和用户名
modelBuilder.Entity()
.HasIndex(u=>new{u.Email,u.UserName})
.IsUnique();
//设置唯一标记名
modelBuilder.Entity()
.HasIndex(t=>t.Name)
.IsUnique();
modelBuilder.Entity()
.HasOne(p=>p.User)
.有许多(u=>u.Posts);
modelBuilder.Entity()
.HasMany(u=>u.Comments)
.有一个(u=>u.User);
//post标记多对多关系
modelBuilder.Entity()
.HasKey(pt=>new{pt.postid,pt.TagUID});
modelBuilder.Entity()
.HasOne(pt=>pt.Post)
.WithMany(p=>p.PostTags)
.HasForeignKey(pt=>pt.postiid);
modelBuilder.Entity()
.HasOne(pt=>pt.Tag)
.WithMany(p=>p.PostTags)
.HasForeignKey(pt=>pt.TagUID);
} 

您正在尝试JSONify一个JSON字符串:

return Json(Newtonsoft.Json.JsonConvert.SerializeObject(posts));
您需要让框架为您做这件事,而不是:

return Json(posts);

您正在尝试JSONify一个JSON字符串:

return Json(Newtonsoft.Json.JsonConvert.SerializeObject(posts));
您需要让框架为您做这件事,而不是:

return Json(posts);

问题是您已经配置了服务,但没有使用该服务。您正在使用对Newtonsoft Json转换器的静态引用。您或者需要使用framework提供的服务(当从控制器返回模型时,它应该自动使用),或者将配置应用于您正在使用的Newtonsoft Json转换器调用。

问题是您已经配置了服务,但没有使用该服务。您正在使用对Newtonsoft Json转换器的静态引用。您要么需要使用框架提供的服务(当从控制器返回模型时,它应该自动使用),要么将配置应用于您正在使用的Newtonsoft Json转换器调用。

这就是问题之一。我将解决双JSON转换,但不会解决循环@Denisx,你应该在不需要的时候删除模型的导航属性。@hugo你在说什么循环?谁告诉你不需要导航属性?仅仅因为它在这里引发了不必要的自我引用,并不意味着它在应用程序的其余部分没有用处。如果您不需要在Post类中引用User,为什么还要麻烦呢?我不说有这样的参考,但如果没有必要,你应该避免它。在大多数情况下,一个类中的一个导航属性足以创建关系和外键。在Json转换过程中,可以避免循环引用问题。我上一次评论的原因。@hugo,你在哪里读到的OP不需要那种关系?作为一个引用,运行时成本完全可以忽略不计,删除它可能会让其他开发人员感到困惑,让他们自问为什么不删除引用。删除Newtonsoft序列化解决了这个问题。这就是问题之一。我将解决双JSON转换,但不会解决循环@Denisx,你应该在不需要的时候删除模型的导航属性。@hugo你在说什么循环?谁告诉你不需要导航属性?仅仅因为它在这里引发了不必要的自我引用,并不意味着它在应用程序的其余部分没有用处。如果您不需要在Post类中引用User,为什么还要麻烦呢?我不说有这样的参考,但如果没有必要,你应该避免它。在大多数情况下,一个类中的一个导航属性足以创建关系和外键。在Json转换过程中,可以避免循环引用问题。我上一次评论的原因。@hugo,你在哪里读到的OP不需要那种关系?作为推荐人,运行时成本完全可以忽略不计,删除它可能会让其他开发人员感到困惑,让他们问自己为什么没有引用。删除Newtonsoft序列化解决了这个问题。我认为这个问题应该编辑掉EF,因为这与此无关。我认为这个问题应该编辑掉EF因为这与此无关。