2016-01-18 29 views
0

这是我的标签表,一个标签可以有多个帖子:插入数据,以多对多的连接表

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,帖子ID) 现在,我已经适当地与流畅API配置,数据插入到TagPost表是这样的:

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

,这是我的控制器将数据插入到后级这样的,在这里我得到选定的标签,但在每个列表,在最后一行它给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值,这里有什么错误,它工作得很好,但现在它在这里给予我建议。

回答

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

} 

你应该做同样在具有集合导航属性的所有实体。

+0

thnks它的工作,但现在,新的问题,你可以在编辑的控制器中看到,TagName仍然返回null,可能是与加载/延迟加载有关的事情。 plzz看,它应该返回所有的标签名称,但空引用异常 – neo

+0

我不这样。标量属性不会延迟加载。当你加载一个实体时,所有的都被加载,也许它没有正确保存(如果是这种情况),或者你不应该有该列的值 – octavioccl

+0

在数据库中正确保存我已经检查两次让我再次检查它 – neo

相关问题