2

我对这一切都很陌生。我目前正在阅读 ASP.NET 网站上的教程“使用 MVC 开始使用 EF”:(第 6 章)

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-应用

在教程中,在标题为“将课程作业添加到讲师编辑页面”的部分中,作者写了如何在讲师页面中编辑课程:

    public ActionResult Edit(int id)
    {
        Instructor instructor = db.Instructors
            .Include(i => i.OfficeAssignment)
            .Include(i => i.Courses)
            .Where(i => i.InstructorID == id)
            .Single();
        PopulateAssignedCourseData(instructor);
        return View(instructor);
    }

public ActionResult Edit(int id, FormCollection formCollection, string[] selectedCourses)
{
    var instructorToUpdate = db.Instructors
        .Include(i => i.OfficeAssignment)
        .Include(i => i.Courses)
        .Where(i => i.InstructorID == id)
        .Single();
    if (TryUpdateModel(instructorToUpdate, "", null, new string[] { "Courses" }))
    {
        try
        {
            if (String.IsNullOrWhiteSpace(instructorToUpdate.OfficeAssignment.Location))
            {
                instructorToUpdate.OfficeAssignment = null;
            }

            UpdateInstructorCourses(selectedCourses, instructorToUpdate);

            db.Entry(instructorToUpdate).State = EntityState.Modified;
            db.SaveChanges();

            return RedirectToAction("Index");
        }
        catch (DataException)
        {
            //Log the error (add a variable name after DataException)
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
       }
    }
    PopulateAssignedCourseData(instructorToUpdate);
    return View(instructorToUpdate);
}

有人可以告诉我如何使用与作者相同的概念来完成删除和创建操作方法吗?或者,如果您可以将我引导到一个有用的教程/站点,该教程/站点有关与 MVC 中的 EF 的多对多关系,特别是关于如何创建控制器和查看多对多相关数据,类似于上面提到的教程。我是这方面的初学者,但我仍然需要完成工作,所以如果使用的概念一致,这将非常有帮助,这对我来说会更容易。

提前非常感谢!

4

2 回答 2

1

创建和删除通常更简单一些。我已经概述了基本结构。创建入口页面的控制器是:

public ViewResult CreateInstructor()
        {
            return View();
        }

要生成创建表单,您可以使用脚手架(只需右键单击视图并选择添加视图...,然后选择适当的模型和页面类型)。此页面的回发由具有 [HttpPost] 属性的控制器处理,它将表单上的数据绑定到传递给控制器​​方法的对象,然后将其传递给您的 DBContext Add() 方法,最后执行SaveChanges() 方法实际命中数据库:

 [HttpPost]
        public ActionResult CreateInstructor(Instructor instructor)
        {
db.Instructors.Add(instructor);
db.Instructors.SaveChanges();
 return View(); //There will be some other logic here typically such as redirecting on a successful creation or showing specific validation issues with the object .

}

删除是使用 DBContext Remove 方法实现的,请注意,您不必先访问数据库来加载对象,然后再删除它。通常会向您传递对象的 id,然后您可以将对象的新实例附加到上下文并删除它。

public ActionResult DeleteInstructor(int instructorId)
        {
var instructor = new Instructor {Id = instructorId};
db.Instructors.Attach(instructor);
db.Instructors.Remove(instructor);
db.Instructors.SaveChanges();
            return View();
        }
于 2012-05-11T05:22:43.163 回答
0

我知道这是一个旧线程。但我试图做同样的事情

这是我的解决方案

//
    // GET: /Project/Create/

    public ActionResult Create()
    {
        var project = new Project();
        ViewBag.Themes = db.Theme.ToList();
        return View(project);
    }

    //
    // POST: /Project/Create/

    [HttpPost]
    public ActionResult Create(Project projet, string[] selectedTheme)
    {
        var errors = ModelState.Select(x => x.Value.Errors).ToList();
        project.Themes = new List<Theme>();

        if (TryUpdateModel(project, "", null, new string[] { "Theme" }))
        {
            try
            {
                UpdateProjectTheme(selectedTheme, project);

                db.Project.Add(project);
                db.SaveChanges();

                return RedirectToAction("Index");
            }
            catch (DataException)
            {
                //Log the error (add a variable name after DataException)
                ModelState.AddModelError("", "Impossible to create project.");
            }
        }
        return View(project);
    }

在创建视图中:

@{
  List<Project.Models.Theme> themes = ViewBag.Themes;
  @:<td>
    foreach (var display in themes)
  {

    <label class="checkbox">
        <input type="checkbox" 
                name="selectedTheme" 
                value="@display.ThemeID" /> 
        @display.Name
    </label>

    if (display.Name.Length > 20)
    {
        @:<br />
    }

    else
    {

        if (display.ThemeID % 2 == 0)
        {
            @:<br />
        }
    }
  }
   @:</td>
 @: </tr>
}

希望你觉得它有用,你也可以看看我的 SO 帖子

这是我的帖子!!

于 2013-03-19T20:16:42.990 回答