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

问题描述:

我是新来的MVC 3和实体框架,所以我想知道什么是最好的方法。MVC3和EF:如何处理嵌套实体(父,子和孙)的CRUD操作

基本上,我有3个实体:课程,模块和章节。每个人都是具有一对多关系的下一个家长(课程有很多模块,模块有很多章节)。我有一个列SortOrder模块和章节,让他们按顺序排列。

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

我心里有3次:

  1. 创建/更新课程:一门课程
  2. 课程模块(用于更新课程基本上是一个不同的观点),其中有一个选项,添加多个部分的所有基本信息视图,每个视图创建模块
  3. 场时间轴(为更新过程中仍然是一个不同的视图),其中列出所有模块(在不同的div),并具有添加多个局部视图的选项,每个创建一个章

我的计划听起来合理吗?我打算使用隐藏字段来存储ID。我也希望保存异步发生。

任何建议或信息将不胜感激。谢谢!

+2

你的问题有点模糊和不确定。这听起来很合理,而且肯定是可行的。我建议你在项目设计或实施过程中遇到问题时,只需开始项目并提出更具体的问题。 – Slauma 2013-03-07 21:27:17

+0

谢谢!欣赏它:) – AnimaSola 2013-03-08 02:21:04

+0

我会补充的唯一建议是,如果你打算异步做事,你应该确保你熟悉JQuery – StanK 2013-03-08 04:25:26

我认为这是你的后,但不知道。为了处理子孙实体的持久性,你可以用几种方法来做到这一点。您可以分别对每个实体执行粗泥土作业。所以这将涉及例如通过参考课程自己保存模块,可能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请求创建一个自定义Anti Forgery Token验证器,example