将数据插入到多对多的连接表中

时间:2016-01-18 13:03:38

标签: asp.net-mvc entity-framework ef-fluent-api

这是我的标签表,一个标签可以有多个帖子:

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

这是我的Post类,一个帖子可以有多个标签:

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

这两个类在数据库中创建了一个新表TagPost,其中包含列(TagId,PostId) 现在,我已经正确配置了流畅的api,数据插入到TagPost表中,如下所示:

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

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

   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值,这里有什么问题,它之前的工作正常,但现在它在这里给我一些建议。

1 个答案:

答案 0 :(得分:2)

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

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

}

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