Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用代码优先mvc的多对多关系问题_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 使用代码优先mvc的多对多关系问题

C# 使用代码优先mvc的多对多关系问题,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我创建了班级和教师的两个模型,我想用代码优先的方法配置多对多关系。 当我向class和teacher表中添加信息时,使用多对多关系实体框架代码优先的方法,不会将值插入TeacherClasses表 下面是模型和控制器的代码 这是班级模式 public class Class { [Key] public int ClassId { get; set; } [Required] public string ClassName { get; set; }

我创建了班级和教师的两个模型,我想用代码优先的方法配置多对多关系。 当我向class和teacher表中添加信息时,使用多对多关系实体框架代码优先的方法,不会将值插入TeacherClasses表

下面是模型和控制器的代码

这是班级模式

public class Class
{
    [Key]
    public int ClassId { get; set; }

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

    public virtual ICollection<Teacher> Teachers { get; set; }

}
这是教师模式

public class Teacher
{
 [Key]  
    public int TeacherId { get; set; }

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

    [DataType(DataType.Date)]
    public DateTime JoiningDate { get; set; }
    public decimal Salary { get; set; }
    public string Email { get; set; }


    public virtual ICollection<Class> Classes { get; set; }


    [NotMapped]
    public virtual Class Class { get; set; }
    [NotMapped]
    public virtual ICollection<int> SelectedClassList { get; set; }

}
我是班主任

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "TeacherId,TeacherName,JoiningDate,Salary,Email,Classes,Class,SelectedClassList")] Teacher teacher)
    {
        if (ModelState.IsValid)
        {
            db.Teachers.Add(teacher);
            db.SaveChanges();

            teacher.Classes = new Collection<Class>();

            foreach (var classId in teacher.SelectedClassList)
            {
                teacher.Classes.Add(new Class {ClassId = classId });
            }

            return RedirectToAction("Index");
        }
        return View(teacher);
    }
这是数据库表的图像

这是老师的观点

<div class="form-group">
    @Html.Label("Class List", htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @*@Html.ListBox("SelectedClassList", ViewData["ClassList"] as MultiSelectList)
        @Html.ValidationMessageFor(model => model.Classes, "", new { @class = "text-danger" })*@
        @Html.ListBoxFor(model => model.SelectedClassList, new MultiSelectList(ViewBag.ClassList, "value", "text"), new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.SelectedClassList, "", new { @class = "text-danger" })

    </div>
</div>

从您的描述和保存数据的方式来看,似乎有两种可能的情况是您试图实现的:

插入新教师并将其连接到现有班级。 将现有教师连接到现有班级。 无论是哪种情况,规则始终是:

首先将现有实体附加到上下文 然后添加新实体 因此,对于第一个场景,将是:

foreach (var classId in teacher.SelectedClassList)
{
    var class = new Class { ClassId = classId }; // "stub" entity
    db.Classes.Attach(class);
    teacher.Classes.Add(class); // Assuming that teacher.Classes isn't null
}
db.Teachers.Add(teacher); // <= Add
db.SaveChanges();
第二种情况是:

db.Teachers.Attach(teacher); // <= Attach
foreach (var classId in teacher.SelectedClassList)
{
    var class = new Class { ClassId = classId }; // "stub" entity
    db.Classes.Attach(class);
    teacher.Classes.Add(class); // Assuming that teacher.Classes isn't null
}
db.SaveChanges();
如您所见,您永远不需要从数据库中提取现有实体。为了创建关联,EF需要知道两端实体的ID值,因此使用存根实体是理想的方法


在第一个场景中,如果您在添加教师之前没有附加这些类,这些类也将被标记为已添加,并且如果它们通过了验证,您将向数据库中插入空的类记录。

您遇到了哪些错误?数据库表的映像没有帮助。请尝试更清楚、更具体地说明此问题。在控制器创建操作中使用此代码时,我发现TeacherClasses表中的值为null时出错。我首先使用具有多对多关系EF代码的multiselect listbox。为什么在填充classes navigation属性之前将教师添加到其dbset并调用SaveChanges?应该做什么我愿意?你能设置我的密码吗?请猜在最后一段的第二个场景中,您实际上指的是第一个场景。在第二个场景中,应该在附加老师后添加链接,否则它们不会被检测为修改。谢谢@Ivan,当然你是对的。我在一个堆栈溢出文档条目中详细说明了这一点,但是的,文档被中断了,所以我想我可以从内存中快速恢复这一点,这总是一个大胆的假设:。