【发布时间】:2016-11-19 07:02:10
【问题描述】:
假设我有一个学生教师视图模型,您可以保存教师,然后为该教师保存学生列表。
public class StudentTeacherVM()
{
public Teacher teacher{ get; set; }
public List<Student> students { get; set; }
}
用户填写老师并提供学生列表。然后我将所有这些保存到数据库中。我保存老师,返回新的teacherid,然后遍历学生,添加新的teacherid,然后保存学生。 (以下代码只是为了演示,我的实际代码有很大不同)。
public ActionResult SaveStudent(StudentTeacherVM model)
{
Repository repo = new Repository();
repo.SaveTeacher(model);
foreach(var s in model.students)
{
//add the new teacherid then save the student
repo.SaveStudent(model);
}
}
每个 repo 调用都会打开和关闭一个数据库连接,因为我使用的是
using(var db = new MyEntity)
{
db.Teacher.Add(newTeacher);
}
我要做的是,如果其中一个学生保存失败,我当前会吐出整个学生列表,但我还需要返回并删除刚刚输入的新老师。
看起来我可以做一个“如果学生无法保存,删除teacherid = newTeacherId的老师”,它似乎工作。
我想知道我是否可以在这里使用某种内置的“回滚”功能,如果有,我是否因为正在打开和关闭数据库连接而“失去资格”使用它?
【问题讨论】:
-
使用 EF,您应该始终尝试将所有工作保存在一个
SaveChanges调用中,该调用管理自己的事务。与基于存储库的代码一样,我们正在查看一个黑盒,它根本无法判断这是否可能。我认为您不应该在存储库中调用 SaveChanges,因此您可以设置引用 (student.Teacher) 而不是 FK 值。应该有一个包含所有更改的 UoW。
标签: asp.net-mvc entity-framework