MVC3和EF:如何处理嵌套实体(父,子和孙)的CRUD操作

时间:2013-03-07 18:33:35

标签: json asp.net-mvc-3 entity-framework razor entity-framework-5

我是MVC 3和实体框架的新手,所以我想知道什么是最好的方法。

基本上,我有3个实体:课程,模块和章节。每个都是下一个具有一对多关系的父母(一个课程有很多模块,一个模块有很多章节)。我有一个用于模块和章节的SortOrder列,可以按顺序排序。

我的想法是在更新父级时为子实体使用部分视图。

我有3个观点:

  1. 创建/更新课程:课程的所有基本详细信息
  2. 课程模块(基本上是更新课程的不同视图),可以选择添加多个部分视图,每个视图创建一个模块
  3. 课程时间表(更新课程的不同视图),列出所有模块(在不同的div上),并可选择添加多个部分视图,每个视图创建一个章节
  4. 我的计划听起来是否正确可行?我打算使用隐藏字段来存储ID。我还希望保存以异步方式发生。

    任何建议或信息都将受到高度赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这是你的事,但不确定。为了处理子/孙实体的持久性,您可以通过多种方式执行此操作。您可以单独对每个实体执行crud操作。因此,这将涉及例如通过引用课程来保存模块,可能是courseId。

或者您可以看一下只保存聚合根,在这种情况下看起来就像是您的课程实体。这将涉及加载课程,在课程中填充模块,并为每个模块填充章节。然后当你`db.Courses.Add(newCourse); db.SaveChanges();所有实体都将被保留。您必须确保正确设置了外键和模型引用。

例如,要保存子实体:

public ActionResult DoSomething(int courseId, Module newModule)
{
    var course = someService.LoadCourse(courseId);
    course.Modules.Add(newModule);

    using (var db = new MyDbContext())
    {
        db.Courses.Add(course);
        db.SaveChanges();
    }

    return RedirectToAction("Success");
}

或者您可以单独保存:

public ActionResult DoSomething(Module newModule)
{
    using (var db = new MyDbContext())
    {
        //You will need to make sure newModule.CourseId is set correctly
        db.Modules.Add(newModule);
        db.SaveChanges();
    }

    return RedirectToAction("Success");
}

根据您的观点,您将能够判断哪种方式最佳。关于异步保存,您可以使用jquery将模型作为json发布来调用这些端点。在旁注中,要注意的一件事是为json请求example创建自定义Anti Forgery Token验证器。