【问题标题】:Is there a way to rollback an Entity Framework session if one save fails?如果保存失败,有没有办法回滚实体框架会话?
【发布时间】: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


【解决方案1】:

您的存储库类将需要公开一个事务范围。

见:https://msdn.microsoft.com/en-us/library/dn456843

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多