向多对多连接插入数据 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>();
}
}
您应该在所有具有集合导航属性的实体中执行相同的操作。
这是我的标签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>();
}
}
您应该在所有具有集合导航属性的实体中执行相同的操作。