#c# #model #copy
#c# #Модель #Копировать
Вопрос:
Я создаю веб-приложение с использованием C # MVC. Я создал модель Trip.cs
с именем и свойствами, как показано ниже:
public int ID {get; set;}
public string Destination {get; set;}
public DateTime DepartureDate {get; set;}
public string MeetPlace {get; set;}
public int NumberOfSeats {get; set;}
public virtual ApplicationUser User { get; set; }
public string UserId { get; set; }
Я создал другую модель с именем ReservedTrip.cs
identic with Trip.cs
с теми же свойствами.
Что я делаю, так это когда зарегистрированный пользователь нажимает на Actionlink
имя «Резервная поездка», я сохраняю это «Путешествие» в ReservedTrip.cs
и уменьшаю количество свойств NumberOfSeats
на 1. Другими словами, я копирую эти данные «отключения» из Trip.cs
в ReservedTrip.cs
. Проблема в том, что когда я отображаю в представлении данных из модели Trip.cs
количество NumberOfSeats
изменений, но в модели ReservedTrip.cs
свойство NumberOfSeats
не меняется. Поэтому я хочу, чтобы изменения свойства NumberOfSeats
model Trip.cs изменились в свойстве NumberOfSeats
, которое будет изменено с тем же значением.
Кто-нибудь может мне помочь?
Комментарии:
1. Я думаю, что таблица резервирования должна быть намного проще, содержать идентификатор поездки и идентификатор пользователя. Тогда количество занятых мест — это количество бронирований, и его не нужно хранить отдельно.
Ответ №1:
С точки зрения дизайна лучше не иметь копии какой-либо таблицы. Хорошим дизайном для этой ситуации может быть что-то вроде этого.
public class Trip
{
public int ID {get; set;}
public string Destination {get; set;}
public DateTime DepartureDate {get; set;}
public string MeetPlace {get; set;}
public int NumberOfSeats {get; set;}
public int CreatedByUserID {get; set;}
public virtual ApplicationUser CreatedByUser {get; set;}
public virtual ICollection<TripReservation> Reservations {get;set;}
}
public class TripReservation
{
public int ID {get; set;}
public int TripID {get; set;}
public int UserID {get; set;}
public virtual Trip Trip {get; set;}
public virtual ApplicationUser User {get; set;}
}
затем в вашем контроллере вы можете создать модель представления с количеством доступных мест, равным
numberOfSeatsAvailable = trip.NumberOfSeats - trip.Reservations.Count();
Если при бронировании можно зарезервировать более 1 места, вы можете просуммировать это из всех бронирований для этой поездки.
Пример: ViewModel
public class TripReservationsViewModel
{
public Trip Trip { get; set; }
public int NumberOfSeatsAvailable { get; set; }
}
Пример: контроллер
public ActionResult TripDetails(int id)
{
var trip = db.Trips.FirstOrDefault(trip => trip.ID == id);
if (trip == null)
{
// Trip does not exist,
// Redirect the user to the trips home page
//
return RedirectToAction("Index");
}
var viewModel = new TripReservationsViewModel();
viewModel.Trip = trip;
viewModel.NumberOfSeatsAvailable = trip.NumberOfSeats - trip.Reservations.Count();
return View(viewModel);
}
Пример: Просмотр
@model TripReservationsViewModel
<h1>Trip Details</h1>
<p>Seats available: @Model.NumberOfSeatsAvailable</p>
etc...
Комментарии:
1. Я не могу использовать миграции для TripReservation, потому что у него нет определенного ключа. Должен ли я также добавить свойство ключа. Кроме того, почему вы удалили общедоступное виртуальное приложение User User { get; set; } общедоступная строка userId { get; set; } Мне нужны они для отображения пользователей, которые создали поездку.
2. Я удалил пользователя, думая, что это пользователь резервирования. Вы можете добавить этого пользователя обратно, и я предлагаю назвать его CreatedByUserId или что-то подобное, чтобы устранить путаницу для себя или любого другого, кто будет смотреть на код в будущем.
3. У вас есть 2 варианта ключа: либо комбинация идентификаторов поездки и пользователя, либо отдельный идентификатор для уникальной записи резервирования. Добавление простого идентификатора в эту таблицу, вероятно, проще.
4. У меня тоже возникают трудности с контроллером. Можете ли вы помочь мне и с контроллером?
5. Это должно быть так же просто, как получить поездку по идентификатору. С какими трудностями вы сталкиваетесь?