#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. Код был слишком длинным для комментария, поэтому я обновил свой вопрос, надеюсь, это поможет 🙂