Возникли проблемы с обновлением списка ссылок на объекты в БД в ASP.NET MVC

#c# #asp.net-mvc

Вопрос:

Я пытаюсь отредактировать список ссылок на объекты в своем контроллере кинотеатра следующим образом —

 public ActionResult Save(Cinema cinema)
{
    var cinemaInDb = _context.Cinemas.Include(c => c.Seats).Single(c => c.Id == cinema.Id);

    cinemaInDb.Name = cinema.Name;
    cinemaInDb.Address = cinema.Address;
    cinemaInDb.NumberOfSeats = cinema.NumberOfSeats;
    cinemaInDb.Seats = SetSeats(cinemaInDb);
    cinemaInDb.OpeningHourId = cinema.OpeningHourId;
    cinemaInDb.ClosingHourId = cinema.ClosingHourId;

    _context.SaveChanges();
}
 

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

Все работает просто отлично, единственная проблема в том, что свойство Seats (которое представляет собой список ссылок на объекты, означающий, что каждое место является отдельной сущностью, имеющей свой собственный идентификатор и значения) не удаляет старые места в базе данных, а просто аннулирует их и добавляет новые места в список.

Итак, если у меня есть кинотеатр на 10 мест, и я хочу отредактировать его, чтобы теперь в нем было 5 мест, это аннулирует 10 мест и добавит 5 новых мест. При отладке все выглядит нормально, свойство cinemaInDb.Seats получает нужные мне значения, проблема только внутри базы данных. Я попытался очистить список, прежде чем что-либо в него добавлять, но это не помогло.

На всякий случай, вот моя функция SetSeats —

 public List<Seat> SetSeats(Cinema cinema)
        {
            List<Seat> Seats = new List<Seat>();
            char rowLetter = 'A';
            int seatNumInRow = 1;
            for (int i = 1; i <= cinema.NumberOfSeats; i  , seatNumInRow  )
            {
                Seats.Add(new Seat
                {
                    Id = i - 1,
                    CinemaId = cinema.Id,
                    Cinema = cinema,
                    Location = ""   rowLetter   seatNumInRow,
                    isAvailable = true
                });
                if ((i % 10) == 0)
                {
                    rowLetter  ;
                    seatNumInRow = 0;
                }
            };
            return Seats;
        }
 

И моя Модель Сиденья —

 public class Seat
    {
        public int Id { get; set; }

        public int? CinemaId { get; set; }

        public Cinema Cinema { get; set; }

        //public byte ScreeningId { get; set; }

        [Required]
        public string Location { get; set; }

        [Required]
        public bool isAvailable { get; set; }

        public Seat()
        {
            isAvailable = true;
        }
    }
 

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

Комментарии:

1. Покажите SetSeats() , что, скорее всего, ваша проблема в этом или в вашем отображении.

2. Как я уже сказал — функция SetSeats возвращает нужные мне значения. Это та же функция, которую я использую, когда создаю новый кинотеатр, и она отлично подходит для меня. При сохранении изменений в базе данных ссылка на объект cinemaInDb выглядит так, как я хочу. Здесь нет лишних мест. Но тогда ТОЛЬКО в базе данных старые места не удаляются, а только аннулируются.

3. Вы говорите, что у вас проблема со свойством Seats, @mxmissile по праву просит вас показать SetSeats() , потому что именно метод, установивший это Seats свойство, вызывает проблему 🙂 Вы видите проблему? Если вы не покажете этот метод, мы не сможем сказать вам, что не так, потому что в вашем коде на самом деле нет ничего, кроме этого метода, который манипулирует Seats свойством…

4. Код был слишком длинным для комментария, поэтому я обновил свой вопрос, надеюсь, это поможет 🙂