向多对多连接插入数据 table

insert data to many to many join table

这是我的标签table,一个标签可以有多个post:

public class Tag
{
    public int TagId { get; set; }
    public string TagName { get; set; }
    public IList<Post> Posts { get; set; }
}

这是我的Postclass,一个post可以有多个标签:

 public class Post
  { 
    [Key]
    public int PostId { get; set; }
    // other related code
    public IList<Tag> Tags { get; set; }
    }

这两个 classes 在数据库中创建了一个新的 table 标签Post,列为 (TagId, PostId) 现在,我已经正确配置了流利的 api,要插入标签 Post table 的数据如下所示:

 modelBuilder.Entity<Tag>()
                    .HasMany(p => p.Posts)
                    .WithMany(t => t.Tags)
                    .Map(m =>
                            {
                                m.ToTable("TagPost");
                                m.MapLeftKey("TagId");
                                m.MapRightKey("PostId");
                            });

这是我的控制器,可以像这样将数据插入 post class,这里我得到了所选标签的列表,但对于每个标签,最后一行给出了 System.NullReferenceException.The代码是:

   public JsonResult Post(Post post,IEnumerable<int> MultipleTags)
    {
        post.User = User.Identity.GetUserId<int>();
            foreach (var tagId in MultipleTags)
            {
                var tag = new Tag { TagId = tagId };
              //  db.Tags.Attach(tag); // this avoids duplicate tags
                post.Tags.Add(tag); // getting error here, system.nullReferenceException 
            }
            db.Posts.Add(post);
            db.SaveChanges();
             var usr = db.Users.FirstOrDefault(x => x.Id == post.PostedBy);
            var ret = new
            {
                TagName = string.Join(",", post.Tags.Select(t => t.TagName)),
            };
            return Json( ret,JsonRequestBehavior.AllowGet);

,当我悬停时,我可以看到标签包含正确的 id 值,这里出了什么问题,之前它工作正常但现在它给了这里请给我一些建议。

您需要在构造函数中初始化标签列表:

public class Post
{ 
  [Key]
  public int PostId { get; set; }
  // other related code
  public virtual IList<Tag> Tags { get; set; }

  public Post()
  {
    Tags=new List<Tag>();
  }

}

您应该在所有具有集合导航属性的实体中执行相同的操作。