【问题标题】:MVC4 Entity Framework 5 Many-To-Many Save Entity to DatabaseMVC4 Entity Framework 5 多对多将实体保存到数据库
【发布时间】:2013-02-12 10:55:45
【问题描述】:

嗨,我一直坚持解决这个问题。我看过很多例子,但我找不到我要找的东西。任何帮助表示赞赏。

我使用 Code-First 方法。

我已启用迁移,并且数据库正常 [Student] - [StudentCourse] - [Course]。

场景:我有两个实体 -> 学生

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

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(true)

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

(也许这是我错了……)

无论如何,我想创建一个包含许多可选课程的新学生(文本框 -> courseName)

我该怎么做?

主要问题是我总是从我的视图 [httpPost]Create -action 得到空值(学生很好,课程列表 = NULL)。

我需要指导如何使这种方法成为可能。

谢谢你!

【问题讨论】:

  • 课程是否存在于您的实体中,只是不在 ViewModel 中?显示将实体模型转换为视图模型的代码。
  • 能否请您发布您的查看代码?
  • @IronMan84 我已将视图添加到帖子中
  • @KevinJunghans 我已经添加了控制器编辑操作。
  • 能否请您发布您的创建操作?

标签: entity-framework asp.net-mvc-4


【解决方案1】:

您的实体未正确设置多对多关系。您需要另一个实体来处理多对多映射。它看起来像这样。

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

    }
}

【讨论】:

  • 我得到了 EF 映射的 [CourseStudent] 关系。学生和课程 PK 存储在表中。稍后我将使用 Fluent API 设置我的外键。现在我只想能够创建(在这种情况下)具有可选许多课程的学生。
  • 感谢您的回答,但我认为这不是我想要的?
  • @JeppePepp - 我很困惑。你的标题表明你想要一个多对多的关系。您是否仍想保持多对多的关系,或者您只是想建立一对多的关系(一个学生可以有很多课程)。即使这样,您也没有正确设置实体。您如何通过 SQL 脚本设置 FK?
  • 我确实想要一个多对多的关系。我使用代码优先的方法。一名学生可以参与许多课程。并且一门课程可以有很多学生。所以我的两个学生表和课程表填充了不同的数据。我的第三个表存储学生和课程之间的关系。但是我可以添加一个没有学生的课程,对于学生也是如此。所以它的0对很多。 0到很多。 CourseStudent 表只是保存信息,例如课程 x 中的所有学生。你更了解我的设计? :)
  • 如果多对多表不需要任何其他字段,他就不需要该实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多