Как скопировать или получить изменяющееся значение свойства модели в другую модель?

#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. Это должно быть так же просто, как получить поездку по идентификатору. С какими трудностями вы сталкиваетесь?