c#-在数据库中添加多对多数据

c#-在数据库中添加多对多数据,c#,asp.net-mvc,visual-studio,C#,Asp.net Mvc,Visual Studio,我正试图为学校开发一个应用程序,我被卡住了。我想为使用数据库中的多对多关系的人添加技能,所以当然中间有一个表。我得到了这个错误; “/”应用程序中出现服务器错误 Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the st

我正试图为学校开发一个应用程序,我被卡住了。我想为使用数据库中的多对多关系的人添加技能,所以当然中间有一个表。我得到了这个错误; “/”应用程序中出现服务器错误

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set 

to an instance of an object.
Source Error: 

Line 99:                     var Skill = new Skill { ID = Skill_ID };
Line 100:                    var Teacher = new Teacher { ID = Teacher_ID };
**Line 101:                    Skill.Teachers.Add(Teacher);**
Line 102:                    db.SaveChanges();
Line 103:                }
这是我的控制器

        // GET: MyProfile/AddkSkills/
        public ActionResult AddSkills()
        {
            var skills = (from s in db.Skills
                          select s); /*new Skill { ID = s.ID, SkillName = s.SkillName });*/

            var Model = new AddSkillsViewModel
            {
                Skills = skills.ToList(),
            };
            return View(Model);
        }

        //POST: MyProfile/AddkSkills/
        [HttpPost]
        public ActionResult AddSkillsPost()
        {
            int Teacher_ID = Convert.ToInt32(Session["Teacher_ID"]);
            var SkillsArray = Request.Form["chk_group[]"];
            if (SkillsArray != null)
            {
                foreach (var skill in SkillsArray)
                {
                    int Skill_ID = Convert.ToInt32(skill);

                    var Skill = new Skill { ID = Skill_ID };
                    var Teacher = new Teacher { ID = Teacher_ID };
                    Skill.Teachers.Add(Teacher);
                    db.SaveChanges();
                }
            }
            return RedirectToAction("MyProfile");
        }
增加技能表

<h2>AddSkills</h2>

<form name="addSkillsForm" action="AddSkillsPost" method="post">
    @foreach (var skill in Model.Skills)
    {
        <input type="checkbox" name="chk_group[]" value="@skill.ID" />@skill.SkillName< br />
    }
    <input type="submit" value="Update Skills" />
</form>
AddSkills
@foreach(Model.Skills中的var技巧)
{
@skill.SkillName
}
编辑1

技能模型

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace Ability_Examen_ASP.Models
{
    [Table("Skills")]
    public class Skill
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [Required]
        public string SkillName { get; set; }

        public virtual List<Teacher> Teachers { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Linq;
使用System.Web;
命名空间功能\u Examen\u ASP.Models
{
[表(“技能”)]
公开课技能
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ID{get;set;}
[必需]
公共字符串SkillName{get;set;}
公共虚拟列表{get;set;}
}
}

当您创建一个新的
技能
对象时,我假设它的
教师
属性为空。您可能需要将该属性初始化为空列表(或其他内容)

一种常见的技术是让
Skill
类(等)的默认构造函数为每个这样的属性自动创建新集合

例如(假设您的
技能
教师
课程是如何定义的):

公开课技能
{
公共技能()
{
this.Teachers=新列表();
}
}
(只需将内部部分添加到现有类中)


如果您首先使用EF数据库,这将自动完成,因此我假设您首先使用代码。

我认为在这种情况下,您最好创建一个类似于

[Table("TeacherSkills")]
public class TeacherSkill
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [Required]
    public int TeacherID { get; set; }

    [ForeignKey("TeacherID ")]
    public Teacher Teacher { get; set; }

    [Required]
    public int SkillID{ get; set; }

    [ForeignKey("SkillID")]
    public Skill Skill { get; set; }
}
然后,您只需将外键添加到教师和技能中,并插入一项新技能即可

db.TeacherSkill.Add(new TeacherSkill(){TeacherID = Teacher_ID, SkillID = Skill_ID});
db.SaveChanges();

这在代码中是什么样子的?我对c#真的是个新手,不知道从哪里开始!谢谢你的回答。我添加了技能模型。是的,我们必须先使用代码。我会试一试的,谢谢。我在技能模型中添加了这一行,但我仍然得到相同的错误。当你说“这一行”时,我可以确认你添加了构造器的所有4行(即从
public Skill()
到右括号)?哦,抱歉,我刚刚添加了内行。错误消失了,但由于某种原因,它没有向数据库添加任何内容:(。
db.TeacherSkill.Add(new TeacherSkill(){TeacherID = Teacher_ID, SkillID = Skill_ID});
db.SaveChanges();