我在数据库中有几个表,我想删除所有数据并重新填充表,然后执行保存更改(因为如果保存失败,我想返回旧数据)。
当我从数据库中删除数据然后尝试将数据添加到数据库中时它失败并说“不允许与处于”已删除“状态的实体添加关系。”但是当我删除数据时然后保存,然后添加新数据并再次保存,一切正常..
这是我的代码,如果它有助于理解问题
// create the new data
SomeDataHolder data = ... ;
// save some data to re-enter back after changes
List<User> usersSave = ctx.Users.ToList();
List<UserPreferences> userPrefsSave = ctx.UserPreferences.ToList();
//clear DB
ctx.UserCourses.RemoveRange(ctx.UserCourses);
ctx.Users.RemoveRange(ctx.Users);
ctx.Specializtions.RemoveRange(ctx.Specializtions);
ctx.Course_Predecessor.RemoveRange(ctx.Course_Predecessor);
ctx.Courses.RemoveRange(ctx.Courses);
ctx.Departments.RemoveRange(ctx.Departments);
ctx.GroupsDetails.RemoveRange(ctx.GroupsDetails);
ctx.LinkTable.RemoveRange(ctx.LinkTable);
下一行会使一切正常,如果没有这一行,代码将在下次保存时失败
// ctx.SaveChanges();
updateDepartmentsCoursesSpecialization(ctx, data.Specializations);
updateCoursePredecessorsAndParallel(ctx, data.Predecessors);
updateGroupDetails(ctx, data.GroupDetails);
updateLectureToPractice(ctx, data.LinkLectureWithPractice);
ctx.Users.AddRange(usersSave);
ctx.UserPreferences.AddRange(userPrefsSave);
ctx.SaveChanges();
答案 0 :(得分:3)
在这里你必须使用Transaction.B'cos,你在你的代码库上做了不止一个原子操作。通过使用Transaction,你可以将几个操作组合到同一个上下文中的一个事务中。如果在内部有任何失败然后所有交易都将被回滚。
交易代码段如下:
using (var ctx = new MyContext())
{
using (var dbContextTransaction = ctx.Database.BeginTransaction())
{
try
{
//1st operations here
ctx.GroupsDetails.RemoveRange(ctx.GroupsDetails);
ctx.LinkTable.RemoveRange(ctx.LinkTable);
ctx.SaveChanges();
//2nd operations here
ctx.Users.AddRange(usersSave);
ctx.UserPreferences.AddRange(userPrefsSave);
ctx.SaveChanges();
dbContextTransaction.Commit();
}
catch (Exception)
{
dbContextTransaction.Rollback();
}
}
}
您可以参考此处获取更多信息:Working with Transactions