2017-01-15 4 views
-1

У меня есть метод post в моем контроллере, который выглядит так, и я хочу, чтобы доступные смены уменьшались на 1 в любое время, когда я отправляю форму. Проблема в том, что когда я запускаю программу в первый раз и публикую форму, все работает отлично, но в последующие времена значения базы данных для AvailableSeats не уменьшаются на 1, она остается постоянной, и я не могу понять Зачем.Значения базы данных не меняются

[HttpPost] 
    public ActionResult Create(BookingViewModel viewModel) 
    { 
     if (viewModel.FromLocationId == viewModel.ToLocationId) 
     { 
      return RedirectToAction("Index"); 
     } 


     var busFromDb = _context.Buses.First(c=>c.Id == viewModel.BusId); 
     var seatsFromDb = busFromDb.BusSeats; 

     var reduce = seatsFromDb - 1; 

     if (busFromDb != null) 
     { 
      var book = new Booking 
      { 
       AvailableSeats = reduce, 
       FromLocationId = viewModel.FromLocationId, 
       ToLocationId = viewModel.ToLocationId, 
       BusId = viewModel.BusId, 
       DateTime = viewModel.DateTime, 
      }; 


      _context.Bookings.Add(book); 
     } 

     _context.SaveChanges(); 
     return RedirectToAction("Index", "Home"); 
    } 

Мои заказы Класс

public class Booking 
{ 
    [Required] 
    public int Id { get; set; } 

    public FromLocation FromLocation { get; set; } 
    public int FromLocationId { get; set; } 

    public ToLocation ToLocation { get; set; } 
    public int ToLocationId { get; set; } 

    public Bus Bus { get; set; } 

    [Required] 
    public int BusId { get; set; } 
    public DateTime DateTime { get; set; } 

    public int AvailableSeats { get; set; } 
} 

Мой автобус класс

public class Bus 
{ 
    public int Id { get; set; } 
    public string BusNumber { get; set; } 
    public BusService BusService { get; set; } 
    public int BusSeats { get; set; } 
} 

BookingsDb

BusesDb

В соответствии с просьбой, это мой DbContext CLAS s

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<Bus> Buses { get; set; } 
    public DbSet<Booking> Bookings { get; set; } 
    public DbSet<FromLocation> FromLocations { get; set; } 
    public DbSet<ToLocation> ToLocations { get; set; } 

    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
} 

После этого я инициализировал его в своем контроллере.

public class BookingsController : Controller 
{ 
    private ApplicationDbContext _context; 

    public BookingsController() 
    { 
     _context = new ApplicationDbContext(); 
    } 
+0

вы отслеживаемые свой ActionResult? это проходит через утверждение? – Valkyrie

+0

@ Valkyriee, и он не прошел первое утверждение if, потому что мой параметр FromLocation не равен моему ToLocation, поэтому, если он прошел через второй, и я видел, что значения меняются, но когда он сохраняется в базе данных, доступные значения остаются неизменными. –

+0

@ shA.t уже пробовал это, но это заставит BusSeats уменьшиться, и это не то, что я хочу. –

ответ

2

В настоящее время, вы вычитать всего автобусные места на 1 (24 - 1), что всегда возвращаете 23 для каждого заказа, потому что вы не измените значение 24 из таблицы Bus, я предполагаю, что общее число мест в данном автобус. Скорее вы можете подсчитать количество заказов, сделанных для каждого автобуса, что дает вам оставшиеся места.

int seatsFromDb = busFromDb.BusSeats; //24 
int soldSeats = _context.Bookings.Count(b => b.BusId == viewModel.BusId); //2 (you need to add more filters) 

int remainingSeats = seatsFromDb - (soldSeats + 1) //include the current booking (sold 3) 

var book = new Booking 
{ 
    AvailableSeats = remainingSeats, 
    // ... 
+0

Большое спасибо. Это сработало. И ваше объяснение очень уместно. –

0

Привет Я попробовал этот код с такой же структурой entitty и теперь результатом является то, что на каждом бронировании BusSeats автобус таблицы сводятся к одному и в таблице бронирования Availabe мест сводятся к одному. Я думаю, это желание, которого ты хотел.

 public ActionResult Index() 
     { 
     -- I hardcoded id because I donthave all view model but with this i was able to achieve the result you required. 
     int BusId = 1; 
     var _context = new TestContext(); 
     var busFromDb = _context.Buses.FirstOrDefault(c => c.Id == BusId); 
     var seatsFromDb = busFromDb.BusSeats; 

     var reduce = seatsFromDb - 1; 

     if (busFromDb != null) 
     { 
      busFromDb.BusSeats = busFromDb.BusSeats - 1; 
      var book = new Booking 
      { 
       AvailableSeats = reduce, 
       BusId = BusId, 
       DateTime =DateTime.Now, 
       Bus = busFromDb 
      }; 
      book.Bus = busFromDb; 
      _context.Entry(busFromDb).State = EntityState.Modified; 


      _context.Bookings.Add(book); 
     } 

     _context.SaveChanges(); 
     return View(); 
    } 

Ниже мои EF классы

 public class TestContext:DbContext 
     { 
      public TestContext() 
       : base("name=TestConnection") 
      { 
      } 
      public virtual DbSet<Bus> Buses { get; set; } 
      public virtual DbSet<Booking> Bookings { get; set; } 
     } 

    } 
    public class Booking 
    {  
     public int Id { get; set; } 
     public Bus Bus { get; set; } 
     public int BusId { get; set; } 
     public DateTime DateTime { get; set; } 
     public int AvailableSeats { get; set; } 
    } 

    public class Bus 
    { 
     public int Id { get; set; } 
     public string BusNumber { get; set; } 
     public int BusSeats { get; set; } 
    } 
+0

С помощью вашего кода вы сокращаете как BusSeats в таблице базы данных шины, так и доступные элементы в таблице базы данных Bookings, и это не то, что я хотел. BusSeats должен оставаться постоянным. Доступные значения должны всегда уменьшаться на 1. Сообщение Abdul объясняет это лучше. В любом случае, спасибо за вашу помощь. –

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