Как я могу обновить сложные объекты в MVC? - PullRequest
1 голос
/ 25 сентября 2019

У меня в основном проблемы со следующими классами: ShoppingBasket и Coupon.Моя модель ShoppingBasket имеет атрибуты:

public Coupon[] theCoupons = new Coupon[20];
public string userForeignKey {get;set;} //To identify which user the basket belongs to
public int iCurrentCoupon {get;set;} //Where I am in the coupon-array

Метод-купон addDoShoppingBasket-Method выглядит следующим образом:

public ActionResult addToShoppingBasket(int id) //Coupon id
        {
            // Get current user
            var store = new UserStore<ApplicationUser>(db);
            var manager = new UserManager<ApplicationUser>(store);
            var currentUser = manager.FindById(User.Identity.GetUserId());

            // Get coupon with selected id
            Coupon tmpCoupon = db.Coupons.SingleOrDefault(x => x.id == id);

            // Get ShoppingBasket of current user
            var tmpBasket = db.ShoppingBaskets.SingleOrDefault(x => x.userForeignKey == currentUser.Id);

            // add the coupon into basket; here's the problem I think
            tmpBasket.theCoupons[tmpBasket.iCurrentCoupon] = tmpCoupon; 

            //there's an if-clause and some other stuff around this, basically not to overwrite already added coupons
            tmpBasket.iCurrentCoupon++; 

            db.SaveChanges();

            return RedirectToAction("Index", "ShoppingBasket");
            }

Индекс-метод ShoppingBasket-Controller:

 public ActionResult Index()
        {
            //Get current user
            var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyContext()));
            var currentUser = manager.FindById(User.Identity.GetUserId());

            //Get shopping basket from selected user
            var basketConsumer = db.ShoppingBaskets.Where(i => i.userForeignKey == currentUser.Id).SingleOrDefault();


            return View(basketConsumer);
        }

При проверке basketConsumer во время запуска программы я вижу, что iCurrentCoupon обновлен правильно, но basketConsumer.theCoupons[basketConsumer.iCurrentCoupon] по-прежнему (/ или снова?) Равен нулю, а сделанные изменения не сохранены.

Я пробовал разные вещи, такие как:

db.ShoppingBaskets.Attach(tmpBasket);
db.Entry(tmpBasket).State = EntityState.Modified;
db.Coupons.Attach(tmpBasket.theCoupons[tmpBasket.iCurrentCoupon];

Мне пришлось перевести большую часть материала, чтобы в коде могли быть небольшие несоответствия.Я давно не работал с asp.net или C # в целом, но это кажется довольно тривиальной вещью, которую я на всю жизнь не могу понять, как решить.Почему iCurrentCoupon сохраняется, а массив - нет (и как я могу это изменить)?Любая помощь очень ценится!

РЕДАКТИРОВАТЬ: Не совсем уверен, в чем проблема, но я исправил ее, сделав theCoupons[] ICollection вместо массива.После этого я обновил оба моих класса так, чтобы они имели отношение «многие ко многим», как показано здесь .Удалил ненужный материал, добавил миграцию, обновил базу данных и все заработало.Я буду держать вопрос открытым, возможно, кто-то может объяснить мне, почему моя первая попытка не сработала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...