2015-10-30 2 views
0

У меня проблема с сохранением изменений в базе данных с сущностью. Я использую три таблицы; AspNetUsers, tblCountry и tblCountry_AspNetUsers.Entity-framework не сохраняет изменения в базе данных

tblCountry_AspNetUsers состоит из двух столбцов; UserId и CountryId, который создает отношения «один ко многим» между tblCountry и AspNetUsers.

В настоящее время я хочу изменить страну определенного пользователя, но инфраструктура сущности не позволяет мне получить доступ к базе данных tblCountry_AspNetUsers и вместо этого создает ICollection AspNetUsers на tblCountry. Я могу назначить Id на AspNetUser напрямую, но я не хочу начинать добавлять/удалять столбцы из таблиц идентификации только с тех пор, как я сначала использую базу данных, и я слышал, что это может привести к проблемам.

В любом случае, я могу удалить из ICollection и сохранить эти изменения в базе данных, но когда я пытаюсь добавить одного и того же пользователя в другую страну, он не сохраняется в базе данных правильно, но я могу найти пользователь в контексте объекта при отладке.

Я попытался подключить и изменить сущность-элемент как добавленным, так и измененным, но когда я пытаюсь это сделать, он вырывается из метода и не обновляет базу данных. (В основном это замерзает, когда я пытаюсь прикрепить)

Мой код для редактирования пользователя выглядит следующим образом:

(Обратите внимание, что UserManager обрабатывает usermodel идентичность, ApplicationUser ,, который не является такой же, как AspNetUsers в этом аспекте)

(Кроме того, tblCountry.AspNetUsers относится к ICollection пользователей, назначенного конкретной стране)

... 
      var aspuser = new AspNetUsers(); 
      using (DbContext dc = new DbContext()) 
      { 
       aspuser = dc.AspNetUsers.First(x => x.Id == userid); 

       var user = await UserManager.FindByIdAsync(userid); 

       user.Email = updatedUser.UserName; 
       user.UserName = updatedUser.Email; 

       var result = await UserManager.UpdateAsync(user); 

       aspuser.tblCountry.AspNetUsers.Remove(aspuser); 

       await dc.SaveChangesAsync(); 

      } 

      using (DbContext dc = new DbContext()) 
      { 
       var c = _country.GetById(newcountryid); 
       c.AspNetUsers.Add(aspuser); 

       await dc.SaveChangesAsync(); 
      } 

      return Users(userid); 
     } 

было бы очень легко, если Wa s таблица, к которой я мог бы получить доступ напрямую, но с подобным ICollection я смущен тем, что я должен сделать, чтобы заставить его работать, и я ценю любой вклад!

Приветствия

ответ

0

Эта линия aspuser = dc.AspNetUsers.First(x => x.Id == userid); внутри using (DbContext dc = new DbContext()), что означает, что объект aspuser отрывается от контекста, когда вы покидаете этот блок. Вы должны сделать:

var c = _country.GetById(newcountryid); 
      c.AspNetUsers.Add(aspuser); 

      await dc.SaveChangesAsync(); 

в том же использующем блоке, что и выше, почему вы его отделили?

+0

Я просто попробовал разделить их, чтобы увидеть, какая разница в нем, но даже если они находятся в том же блоке, что и функция удаления, по какой-то причине она не сохраняет новую коллекцию AspNetUsers в базе данных. –

+0

Дождитесь секунды, если у вас есть таблица tblCountry_AspNetUsers, тогда это много для многих отношений, а не для многих, и Entity должен также создать ICollection of Countries в классе AspNetUser. У вас есть эта собственность? – Aleksa

+0

Нет, поскольку я использую UserId как первичный ключ в tblCountry_AspNetUsers. Что я имею в классе AspNetUser, хотя это; общественный виртуальный tblCountry tblCountry {get; задавать; } –

Смежные вопросы