Ich versuche eine Anwendung für die Schule zu entwickeln und stecke fest. Ich möchte einer Person, die eine Viele-zu-Viele-Beziehung in der Datenbank verwendet, Fähigkeiten hinzufügen, daher gibt es natürlich eine Tabelle dazwischen. Ich erhalte diesen Fehler. Serverfehler in '/' Anwendung.

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:                }

Das ist mein Controller;

        // 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");
        }

Fertigkeitsformular hinzufügen;

<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>

Edit1;

Fähigkeitsmodell

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; }
    }
}
1
Joren Polfliet 5 Jän. 2016 im 18:27

2 Antworten

Beste Antwort

Wenn Sie ein neues Skill Objekt erstellen, gehe ich davon aus, dass die Eigenschaft Teachers null ist. Möglicherweise müssen Sie diese Eigenschaft mit einer leeren Liste (oder was auch immer) initialisieren.

Eine übliche Technik besteht darin, dass der Standardkonstruktor für die Klasse Skill (usw.) automatisch neue Sammlungen für jede dieser Eigenschaften erstellt.

Zum Beispiel (Annahmen darüber treffen, wie Ihre Klassen Skill und Teacher definiert sind):

public class Skill
{
    public Skill()
    {
        this.Teachers = new List<Teacher>();
    }
}

(Fügen Sie einfach den inneren Teil zu Ihrer vorhandenen Klasse hinzu).

Dies wird automatisch durchgeführt, wenn Sie EF Database-First verwenden. Ich gehe also davon aus, dass Sie Code-First verwenden.

1
Gary McGill 5 Jän. 2016 im 15:34

Ich denke, Sie wären in diesem Fall besser dran, wenn Sie nur eine Kreuzungstabelle erstellen würden

[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; }
}

Dann müssen Sie nur noch Ihre Fremdschlüssel zu Lehrer und Fertigkeit hinzufügen und einfach eine neue Fertigkeit einfügen

db.TeacherSkill.Add(new TeacherSkill(){TeacherID = Teacher_ID, SkillID = Skill_ID});
db.SaveChanges();
0
JamieD77 5 Jän. 2016 im 15:49