public static async Task Change(this SubscriptionVehicle subscriptionVehicle, ApplicationDbContext db)
        {
            var oldSubscriptionVehicle = await db.SubscriptionVehicles.FirstOrDefaultAsync(
                sp => sp.VehicleId.Equals(subscriptionVehicle.OldVehicleId) &&
                sp.SubscriptionId.Equals(subscriptionVehicle.OldSubscriptionId));

            var newSubscriptionVehicle = await db.SubscriptionVehicles.FirstOrDefaultAsync(
                sp => sp.VehicleId.Equals(subscriptionVehicle.VehicleId) &&
                sp.SubscriptionId.Equals(subscriptionVehicle.SubscriptionId));

            if (oldSubscriptionVehicle != null && newSubscriptionVehicle == null)
            {
                newSubscriptionVehicle = new SubscriptionVehicle
                {
                    SubscriptionId = subscriptionVehicle.SubscriptionId,
                    VehicleId      = subscriptionVehicle.VehicleId
                };

                using (var transaction = new TransactionScope(
                           TransactionScopeAsyncFlowOption.Enabled))
                {
                    try
                    {
                        db.SubscriptionVehicles.Remove(oldSubscriptionVehicle);
                        db.SubscriptionVehicles.Add(newSubscriptionVehicle);

                        await db.SaveChangesAsync();

                        transaction.Complete();
                    }
                    catch
                    { transaction.Dispose(); }
                }
            }
        }
        public async Task <ActionResult> DeleteConfirmed(
            int subscriptionId, int vehicleId)
        {
            SubscriptionVehicle subscriptionVehicle =
                await GetSubscriptionVehicle(subscriptionId, vehicleId);

            db.SubscriptionVehicles.Remove(subscriptionVehicle);
            await db.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }
        public async Task <ActionResult> Create([Bind(Include = "VehicleId,SubscriptionId")] SubscriptionVehicle subscriptionVehicle)
        {
            if (ModelState.IsValid)
            {
                db.SubscriptionVehicles.Add(subscriptionVehicle);
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }

            return(View(subscriptionVehicle));
        }
        public static async Task <bool> CanChange(
            this SubscriptionVehicle subscriptionVehicle, ApplicationDbContext db)
        {
            var oldSP = await db.SubscriptionVehicles.CountAsync(sp =>
                                                                 sp.VehicleId.Equals(subscriptionVehicle.OldVehicleId) &&
                                                                 sp.SubscriptionId.Equals(subscriptionVehicle.OldSubscriptionId));

            var newSP = await db.SubscriptionVehicles.CountAsync(sp =>
                                                                 sp.VehicleId.Equals(subscriptionVehicle.VehicleId) &&
                                                                 sp.SubscriptionId.Equals(subscriptionVehicle.SubscriptionId));

            return(oldSP.Equals(1) && newSP.Equals(0));
        }
        // GET: Admin/SubscriptionVehicle/Details/5
        public async Task <ActionResult> Details(int?subscriptionId, int?vehicleId)
        {
            if (subscriptionId == null || vehicleId == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            SubscriptionVehicle subscriptionVehicle =
                await GetSubscriptionVehicle(subscriptionId, vehicleId);

            if (subscriptionVehicle == null)
            {
                return(HttpNotFound());
            }
            return(View(await subscriptionVehicle.Convert(db)));
        }
        public async Task <ActionResult> Edit([Bind(
                                                   Include = "VehicleId,SubscriptionId,OldVehicleId,OldSubscriptionId")]
                                              SubscriptionVehicle subscriptionVehicle)
        {
            if (ModelState.IsValid)
            {
                var canChange = await subscriptionVehicle.CanChange(db);

                if (canChange)
                {
                    await subscriptionVehicle.Change(db);
                }

                return(RedirectToAction("Index"));
            }
            return(View(subscriptionVehicle));
        }
        public static async Task <SubscriptionVehicleModel> Convert(
            this SubscriptionVehicle subscriptionVehicle,
            ApplicationDbContext db,
            bool addListData = true)
        {
            var model = new SubscriptionVehicleModel
            {
                SubscriptionId    = subscriptionVehicle.SubscriptionId,
                VehicleId         = subscriptionVehicle.VehicleId,
                Subscriptions     = addListData ? await db.Subscriptions.ToListAsync() : null,
                Vehicles          = addListData ? await db.Vehicles.ToListAsync() : null,
                SubscriptionTitle = (await db.Subscriptions.FirstOrDefaultAsync(s =>
                                                                                s.Id.Equals(subscriptionVehicle.SubscriptionId))).Title,
                VehicleTitle = (await db.Vehicles.FirstOrDefaultAsync(v =>
                                                                      v.Id.Equals(subscriptionVehicle.VehicleId))).Title
            };

            return(model);
        }