MVC3和EF:如何处理嵌套实体(父,子和孙)的CRUD操作
问题描述:
我是新来的MVC 3和实体框架,所以我想知道什么是最好的方法。MVC3和EF:如何处理嵌套实体(父,子和孙)的CRUD操作
基本上,我有3个实体:课程,模块和章节。每个人都是具有一对多关系的下一个家长(课程有很多模块,模块有很多章节)。我有一个列SortOrder模块和章节,让他们按顺序排列。
我的想法是在更新父项时使用子实体的部分视图。
我心里有3次:
- 创建/更新课程:一门课程
- 课程模块(用于更新课程基本上是一个不同的观点),其中有一个选项,添加多个部分的所有基本信息视图,每个视图创建模块
- 场时间轴(为更新过程中仍然是一个不同的视图),其中列出所有模块(在不同的div),并具有添加多个局部视图的选项,每个创建一个章
我的计划听起来合理吗?我打算使用隐藏字段来存储ID。我也希望保存异步发生。
任何建议或信息将不胜感激。谢谢!
答
我认为这是你的后,但不知道。为了处理子孙实体的持久性,你可以用几种方法来做到这一点。您可以分别对每个实体执行粗泥土作业。所以这将涉及例如通过参考课程自己保存模块,可能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。
你的问题有点模糊和不确定。这听起来很合理,而且肯定是可行的。我建议你在项目设计或实施过程中遇到问题时,只需开始项目并提出更具体的问题。 – Slauma 2013-03-07 21:27:17
谢谢!欣赏它:) – AnimaSola 2013-03-08 02:21:04
我会补充的唯一建议是,如果你打算异步做事,你应该确保你熟悉JQuery – StanK 2013-03-08 04:25:26