【问题标题】:insert data to many to many join table将数据插入多对多连接表
【发布时间】:2016-01-18 21:39:57
【问题描述】:

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

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) 现在,我已经正确配置了 fluent 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 值,这里出了什么问题,它之前工作正常,但现在它在这里给我一些建议。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢它的工作,但现在,新问题,你可以在编辑的控制器中看到,TagName 仍然返回 null,可能与急切加载/延迟加载有关。请看,它应该返回所有标签名称,但空引用异常
    • 我不这么认为。标量属性不是延迟加载的。当你加载一个实体时,所有的都被加载了,也许它没有正确保存(如果是这样的话)或者你不应该有那个列的值
    • 在数据库中它已正确保存我检查了两次让我再检查一次
    • 这很奇怪,您确定 TagName 属性已正确映射到数据库中的该列吗?
    • 仍然没有得到同样的错误不知道为什么它返回 null 它应该显示所有标签名称@octavioccl
    猜你喜欢
    • 2015-06-06
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多