在MVC ASP.NET和EF中简单的CRUD交集表方法?

时间:2013-07-16 16:10:12

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

我正在使用C#,MVC3,EF5,SQL Server 2008 R2。

我有一个交叉表即

Lecturer -< LecturerCourse >- Course

填充了讲师名单。

当我添加一门课程时,我可以选择一个可以选择的讲师列表,教授相关课程。当我保存新的课程记录时,这个多选还应该通过模型绑定将其数据保存回“LecturerCourse”表。

我正在使用EF5。

你能推荐一种简单而标准的方法来解决连接的CRUD,即“LecturerCourse”,表吗?我在网上看过,但有些方法看起来很复杂。

非常感谢。

1 个答案:

答案 0 :(得分:2)

好吧,这将是一个漫长的过程。要允许这种情况发生在“一页”中(通过POST,或者您可以在技术上使用Ajax),您需要结合方法的Get和Post版本并正确构建视图模型。以下是我将用于演示目的的类:

public class NewCourse
{
    [Required]
    public string Name { get; set; }
    // And your other properties
    public int[] LecturerIds { get; set; }
}

public class ViewLecturer
{
    public int Id { get; set; }
    public int Name { get; set; }
}

public class NewCourseViewModel
{
    public NewCourse Course { get; set; }
    public IEnumerable<ViewLecturer> Lecturers { get; set; }
}

NewCourseViewModel将成为View的模型(见下文)。 ViewLecturer会为您提供可用的Lecturer与添加到其中所需信息之间的较轻的映射。

至于Controller

public class CourseController : Controller, IDisposable
{
    private Lazy<YourContext> lazyContext = 
        new Lazy<YourContext>(() => new YourContext());

    private YourContext Context 
    {
        get { return lazyContext.Value; }
    }

    public ActionResult New()
    {
        var model = new NewCourseViewModel {
            Course = new NewCourse(),
            Lecturers = Context.Lecturers
                               .Select(l => new ViewLecturer { Id = l.Id, Name = l.Name })
        };

        return View(model);
    }

    [HttpPost]
    public ActionResult New(NewCourse course)
    {
        if(ModelState.IsValid)
        {
            var lecturers = course.Lecturers
                                  .Select(l => new Lecturer { Id = l.Id })
                                  .ToList();

            foreach(var lecturer in lecturers)
                Context.Lecturers.Attach(lecturer);

            var newCourse = new Course {
                Name = course.Name,
                // ... and the rest of the mapping
                Lecturer = lecturers
            };

            context.Courses.Add(newCourse);
            context.SaveChanges();
            // Could have to handle DbUpdateException if you want

            return RedirectToAction(...);
        }

        return View(new NewCourseViewModel {
            Course = course,
            Lecturers = Context.Lecturers
                               .Select(l => new ViewLecturer { Id = l.Id, Name = l.Name })
        });
    }

    public void Dispose()
    {
        if(lazyContext.IsValueCreated)
            lazyContext.Value.Dispose();
    }
}

您的第一个New方法会为您提供Course创建页面的入口点。其余的验证和实际添加将通过[HttpPost]重载完成。至于您的View(应该在~/Views/Course/New.cshtml中):

@model NewCourseViewModel

// ... Then when you are ready to begin the form

@using(Html.BeginForm("New", "Course", FormMethod.Post))
{
    // Your List of Lecturers    
    @Html.ListBoxFor(m => m.Course.LecturerIds, 
                     new MultiSelectList(
                         Model.Lecturers, 
                         "Id", 
                         "Name", 
                         m.Course.LecturerIds ?? new int[0]
                     ))

    // Your Other Model binding
}

当按下提交按钮时,匹配的动作将是New(NewCourse course)。由于HtmlHelper生成ID的方式,名称很重要。因为我们只包含整个视图模型的一个属性,所以它将根据视图模型的course属性匹配参数名Course。您将获得讲师的Id列表,您可以使用这些列表附加到DbContext并直接添加到新的Course模型(实体框架将完成剩下的工作) )。如果出现问题,我们可以取回讲师列表并在视图模型中重复使用相同的NewCourse

现在这个例子非常基础,但它应该为你如何构建视图模型提供一个很好的起点。