C# 使用实体框架从数据库中添加和删除数据

C# 使用实体框架从数据库中添加和删除数据,c#,database,entity-framework,asp.net-mvc-4,entity-framework-6,C#,Database,Entity Framework,Asp.net Mvc 4,Entity Framework 6,我在数据库中有几个表,我想删除所有数据并重新填充这些表,然后执行保存更改(因为如果保存失败,我想返回到旧数据) 当我从数据库中删除数据,然后尝试将数据添加到数据库中时,它会失败并说“不允许添加与处于已删除状态的实体的关系”。但当我删除数据,然后保存,然后添加新数据并再次保存时,一切正常 这是我的代码,如果它有助于理解问题的话 // create the new data SomeDataHolder data = ... ; // save some data to re-enter back

我在数据库中有几个表,我想删除所有数据并重新填充这些表,然后执行保存更改(因为如果保存失败,我想返回到旧数据)

当我从数据库中删除数据,然后尝试将数据添加到数据库中时,它会失败并说“不允许添加与处于已删除状态的实体的关系”。但当我删除数据,然后保存,然后添加新数据并再次保存时,一切正常

这是我的代码,如果它有助于理解问题的话

// 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);

这里您必须使用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(); 
                    } 
                } 
            } 

有关更多信息,请参阅此链接:

问题仍然存在。在同一个地方。是否需要将实体框架操作更改为SQL命令?或者我仍然可以在此事务中使用EF命令尝试向上下文中添加项时发生相同的错误。。你知道吗?它发生在“updateCoursePredecessorsAndParallel”函数中的保存更改之前(该函数只执行ctx.SomeTable.AddRange(SomeData))我相信它太长了,无法在这里发布(但如果您知道我可以将代码发送到哪里,我会这样做),我可以尝试解释一下,您看到的每个更新函数都会收到一个字符串矩阵(data.something)信息和背景。然后,该函数将从字符串表中创建一个项目列表到对象列表中,并尝试使用项目填充数据库,而不进行保存,直到最后一次更新时,您看到上面的保存更改。太棒了!这正是问题所在。谢谢嗨@Sampath,我看到这个问题已经解决了,所以我只能说+1:)
 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(); 
                    } 
                } 
            }