私は学生教師ビューモデルを持っており、教師とその教師の生徒リストを保存することができます。1つの保存が失敗した場合、Entity Frameworkセッションをロールバックする方法はありますか?
public class StudentTeacherVM()
{
public Teacher teacher{ get; set; }
public List<Student> students { get; set; }
}
ユーザーが教師に記入し、学生のリストを提供します。私はそれをすべてデータベースに保存します。私は先生を救い、新しい先生を返してから、生徒をループさせて、新しい先生に指をかけて、生徒を救う。 (デモンストレーションのためだけにコードに従ってください、私の実際のコードは大きく異なります)。
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);
}
}
生徒の一人が、保存に失敗した場合、私は私がやろうとしています何
using(var db = new MyEntity)
{
db.Teacher.Add(newTeacher);
}
を使用していますが、あるため、それらのレポ・コールのそれぞれは、DB接続を開閉し、私は現在の串生徒のリスト全体を取り出すことができますが、私はまた戻って、ちょうど入力された新しい教師を削除する必要があります。
私は "生徒が保存に失敗した場合、teacherid = newTeacherIdの先生を削除してください"ということができます。
私はここで使用できる「ロールバック」機能が組み込まれているのだろうかと思いますが、もしあれば、私はデータベース接続を開いたり閉じたりしているため「使用できません」と言いますか?
EFを使用すると、常に独自のトランザクションを管理して1 'SaveChanges'呼び出し、中のAl作業を保存するようにしてください。リポジトリベースのコードでは、しばしばこれが可能かどうかを知らないブラックボックスがあります。私はあなたがリポジトリでSaveChangesを呼び出すべきではないと思うので、FK値の代わりに参照(student.Teacher)を設定することができます。すべての変更を保存する包括的なUoWが存在するはずです。 –