嗨,我一直坚持这个问题。我看了很多例子,但我找不到我想要的东西。任何帮助表示赞赏。
我使用Code-First方法。
我启用了迁移,数据库很好[学生] - [学生课程] - [课程]。
情景:我有两个参与者 - >学生
public class Student { public int Id { get; set; } public string Name { get; set; } public virtual List<Course> Courses { get; set; } }
和课程
public class Course { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public virtual List<Student> Students { get; set; } }
没什么好看的......我创建了一个ViewModel - &gt;
public class StudentCourseViewModel { public int Id { get; set; } public string Name { get; set; } public List<Course> Courses { get; set; } }
查看:
@model Project.Web.Models.StudentCourseViewModel @ { ViewBag.Title =“编辑”; }
编辑
@using(Html.BeginForm()){ @ Html.ValidationSummary(真)
<fieldset> <legend>Student</legend> @Html.HiddenFor(model => model.Id) <div class="editor-label"> @Html.LabelFor(model => model.Name) </div> <div class="editor-field"> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div> <div class="editor-label"> @Html.LabelFor(model => model.Courses) </div> <div class="editor-field"> @for (int i = 0; i < Model.Students.Count(); i++) { <div style="border: dotted 1px; padding: 5px; margin: 10px;"> @Html.HiddenFor(s => s.Students[i].Id) @Html.LabelFor(s => s.Students[i].Name[i + 1]) @Html.EditorFor(s => s.Students[i].Name) </div> } </div> <p> <input type="submit" value="Save" /> </p> </fieldset> }
控制器操作:
[HttpPost] public ActionResult Edit(CourseStudentViewModel model) { var course = db.Courses.Find(model.CourseId); course.Name = model.CourseName; course.Description = model.CourseDescription; course.Students = model.Students; if (ModelState.IsValid) { db.Entry(course).State = System.Data.EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(model); }
(Maby这是我出错了......)
无论如何, 我想创建一个可选多门课程的新学生 (textboxes - &gt; courseName)
我该怎么做?
主要问题是我总是从我的视图中获取空值(学生很好,课程列表= NULL)[httpPost]创建-action。
我需要指导如何使这种方法成为可能。
Thx J!
答案 0 :(得分:0)
您的实体未针对多对多关系正确设置。您需要另一个实体来处理多对多映射。它看起来像这样。
public class StudentsToCourses
{
public int StudentId {get; set;}
public int CourseId {get; set;}
public virtual Student Student {get; set;}
public virtual Course Course {get; set;}
}
然后你的学生模特应该改为这个。
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<StudentsToCourses> Courses { get; set; }
}
你的模特改变了这一点。
public class Course
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual List<StudentsToCourses> Students { get; set; }
}
您还需要使用Fluent API设置外键关系。它看起来像这样。
public class StudentsToCoursesConfiguration : EntityTypeConfiguration<StudentsToCourses>
{
internal StudentsToCoursesConfiguration ()
{
this.HasKey(p => new {p.StudentId, p.CourseId});
this.HasRequired(p => p.Student)
.WithMany(p => p.Courses)
.HasForeignKey(p => p.StudentId);
this.HasRequired(p => p.Course)
.WithMany(r => r.Students)
.HasForeignKey(p => p.CourseId);
}
}