1

У меня есть несколько таблиц в БД, и я хочу удалить все данные и повторно заполнить таблицы, а затем выполнить изменения сохранения (потому что в случае неудачи сохранения я хочу вернуться к старым данным).Добавление и удаление данных из db с использованием Entity Framework

Когда я удаляю данные из БД, а затем пытаюсь добавить данные в БД, он не работает и говорит: «Добавить отношения с сущностью, находящейся в состоянии« Удалено », не разрешено», но когда я удаляю затем данные сохранить, а затем добавить новые данные и сохраняет снова, все работает отлично ..

вот мой код, если это помогает понять проблему

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

ответ

3

Здесь вы должны использовать Transaction.B'cos вы делаете более одной атомарной операции на программном коде base.By с помощью транзакции, где вы можете объединить несколько операций в одной транзакции в пределах одной и той же context.If в ходе транзакции есть какой-либо сбой, тогда все будет скроено.

Код транзакции фрагмент кода, как это:

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

+0

проблема все еще происходит. в том же месте. Мне нужно изменить операции сущности на команды SQL? или я все еще могу использовать команды EF с этими транзакциями – Adam

+0

Oh..No need.you можете использовать любую команду EF. – Sampath

+0

Такая же ошибка возникает при попытке добавить элементы в контекст. Поняла? это происходит до сохранения изменений в функции updateCoursePredecessorsAndParallel (которые только делают ctx.SomeTable.AddRange (SomeData)) – Adam