使用MVC asp.net将值插入到多个数据库中无法正常工作

时间:2015-04-29 23:46:50

标签: c# asp.net-mvc

我有两个表帖子和关键词每个帖子可以有很多关键词,每个关键词都可以在很多帖子中使用。使用实体框架我创建了两个表,它自动创建了包含两个表主键的链接表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; }


}

2 个答案:

答案 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)

  1. 检查id实际上是否为空。这是您在模型Post中没有自己设置的唯一一个字段。您还要添加一个新关键字发布,但实际上是否在数据库中插入了什么? db.Posts.Add(post)仅在帖子表中添加新行,但不在关键字中添加。我猜这两个表之间存在一些外键关系,并且你没有正确填充它。您可能希望使用post.keywords.Add(kw)
  2. 而不是db.KeyWords.Add(kw)

    第二件事是db.Table_Name支持方法Find。例如db.Posts.Find(id)。您可以尝试使用它而不是自定义方法。

    第三件事是我在数据库中建议1到*关系而不是*在你的情况下*。