我有两个表帖子和关键词每个帖子可以有很多关键词,每个关键词都可以在很多帖子中使用。使用实体框架我创建了两个表,它自动创建了包含两个表主键的链接表KeyWordPost。当我尝试使用下面的代码插入时,我在插入过程中不断收到Nullreference异常。
public ActionResult Update(int? id, string title, string body, string author, string keywords)
{
if (!IsAdmin)
{
return RedirectToAction("Index");
}
Post post = GetPost(id);
post.Title = title;
post.Body = body;
post.Authorised = true;
post.Author = "admin";
keywords = keywords ?? string.Empty;
string[] keynames = keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string keyname in keynames)
{
KeyWord kw = GetKeyWord(keyname);
post.KeyWords.Add(kw);
}
if (!id.HasValue) {
db.Posts.Add(post); }
db.SaveChanges();
return RedirectToAction("Details", new { id = post.Id });
}
private KeyWord GetKeyWord(string keyname)
{
return db.KeyWords.Where(x => x.Name == keyname).FirstOrDefault() ?? new KeyWord() { Name = keyname };
}
发布表格模型
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public Boolean Authorised { get; set; }
public string Author { get; set; }
public ICollection<KeyWord> KeyWords { get; set; }
}
关键字模型
public class KeyWord
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Post> Posts { get; set; }
}
答案 0 :(得分:1)
在额外的行中添加,似乎已经自行修复了
foreach (var keynum in keynames)
{
KeyWord KeytoAdd = db.KeyWords.Find(int.Parse(keynum));
post.KeyWords = new List<KeyWord>();
post.KeyWords.Add(KeytoAdd);
}
答案 1 :(得分:0)
id
实际上是否为空。这是您在模型Post中没有自己设置的唯一一个字段。您还要添加一个新关键字发布,但实际上是否在数据库中插入了什么? db.Posts.Add(post)
仅在帖子表中添加新行,但不在关键字中添加。我猜这两个表之间存在一些外键关系,并且你没有正确填充它。您可能希望使用post.keywords.Add(kw)
db.KeyWords.Add(kw)
醇>
第二件事是db.Table_Name支持方法Find。例如db.Posts.Find(id)
。您可以尝试使用它而不是自定义方法。
第三件事是我在数据库中建议1到*关系而不是*在你的情况下*。