MVC Entity Framework: поле обновления для нескольких записей в таблице - PullRequest
0 голосов
/ 20 мая 2018

Я немного изо всех сил пытаюсь определить, является ли это просто проблемой дизайна и / или как я мог бы решить следующий сценарий с точки зрения кодирования:

В моем проекте я разрешаю пользователю добавить несколько отправленийадреса.Очевидно, что одним из них должен быть адрес доставки.Однако я хочу предложить возможность изменить это на усмотрение пользователя.Поэтому я сохранил адреса доставки в столбце «IsDefaultShippingAddress» (bool).Я имею в виду, что, когда пользователь выбирает адрес доставки по умолчанию, для этой колонки модель передает значение «true».

Теперь в сценарии, когда у пользователя есть существующая доставкаадрес, который выбран по умолчанию, и который хотел бы добавить новый адрес доставки по умолчанию (или повысить существующий адрес доставки по умолчанию), я бы, естественно, оказался в сценарии, когда один и тот же пользователь имеет две (несколько) записи в одной таблицегде 'IsDefaultShippingAddress' равен 'true' - но я хочу, чтобы это был только один адрес (последний продвинутый) в соответствии с характером термина "default".

Поэтому мой вопрос: какмогу ли я убедиться, что все записи, соответствующие определенным критериям (UserID), обновлены до 'IsDefaultShippingAddress' 'false', в то время как недавно повышенный адрес доставки (отдельная строка в той же таблице) установлен на 'IsDefaultShippingAddress' 'true'?

Вот мой код контроллера, в котором проблема не решена:

// POST: /Manage/EditShippingAddress
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EditShippingAddress([Bind(Include = "ID,UserID,IsDefaultShippingAddress,ShippingAddressCompanyName,ShippingAddressFirstName,ShippingAddressLastName,ShippingAddressAdditional,ShippingAddressStreet,ShippingAddressNumber,ShippingAddressZIP,ShippingAddressCity,ShippingAddressState,ShippingAddressCountry,ShippingInstructions,UpdatedLatitude,UpdatedLongitude,UpdatedLocation")] ShippingAddresses model)
    {
        // define variables
        var userID = User.Identity.GetUserId();
        DateTime nowUTC = DateTime.Now.ToUniversalTime();
        DateTime nowLocal = DateTime.Now.ToLocalTime();
        // pass first name to viewbag for personalization
        ViewBag.Personalization = UserManager.FindById(userID).FirstName.ToString();
        if (ModelState.IsValid)
        {
            DATADB.Entry(model).State = System.Data.Entity.EntityState.Modified;
            DATADB.SaveChanges();
            return RedirectToAction("ShippingAddresses");
        }
        return View(model);
    }

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Спасибо, Сельчук, с вашей помощью я встал на правильный путь.У меня несколько поворотов, и теперь у меня есть решение:

public ActionResult EditShippingAddress([Bind(Include = "ID,UserID,IsDefaultShippingAddress,ShippingAddressCompanyName,ShippingAddressFirstName,ShippingAddressLastName,ShippingAddressAdditional,ShippingAddressStreet,ShippingAddressNumber,ShippingAddressZIP,ShippingAddressCity,ShippingAddressState,ShippingAddressCountry,ShippingInstructions,UpdatedLatitude,UpdatedLongitude,UpdatedLocation")] ShippingAddresses model)
    {
        // define variables
        var userID                                                  = User.Identity.GetUserId();
        DateTime nowUTC                                             = DateTime.Now.ToUniversalTime();
        DateTime nowLocal                                           = DateTime.Now.ToLocalTime();
        // pass first name to viewbag for personalization
        ViewBag.Personalization                                     = UserManager.FindById(userID).FirstName.ToString();
        if (ModelState.IsValid)
        {
            if (model.IsDefaultShippingAddress)
            {
                var addresses = DATADB.ShippingAddressList
                    .Where(a => a.UserID                            == userID);
                var address = DATADB.ShippingAddressList
                    .Where(a => a.ID                                == model.ID);
                addresses.ForEach(a => a.IsDefaultShippingAddress   = false);
                address.ForEach(a => a.IsDefaultShippingAddress     = model.IsDefaultShippingAddress);
                address.ForEach(a => a.ShippingAddressCompanyName   = model.ShippingAddressCompanyName);
                address.ForEach(a => a.ShippingAddressFirstName     = model.ShippingAddressFirstName);
                address.ForEach(a => a.ShippingAddressLastName      = model.ShippingAddressLastName);
                address.ForEach(a => a.ShippingAddressAdditional    = model.ShippingAddressAdditional);
                address.ForEach(a => a.ShippingAddressStreet        = model.ShippingAddressStreet);
                address.ForEach(a => a.ShippingAddressNumber        = model.ShippingAddressNumber);
                address.ForEach(a => a.ShippingAddressZIP           = model.ShippingAddressZIP);
                address.ForEach(a => a.ShippingAddressCity          = model.ShippingAddressCity);
                address.ForEach(a => a.ShippingAddressState         = model.ShippingAddressState);
                address.ForEach(a => a.ShippingAddressCountry       = model.ShippingAddressCountry);
                address.ForEach(a => a.ShippingInstructions         = model.ShippingInstructions);
            }
            DATADB.SaveChanges();
            // track user activity: post method includes activity name and timestamp along with location
            var SUCCESS                                             = new UserActivities
            {
                UserID                                              = userID,
                ActivityName                                        = "EditShippingAddress_Success",
                ActivityTimeStampUTC                                = nowUTC,
                ActivityLatitude                                    = model.UpdatedLatitude,
                ActivityLongitude                                   = model.UpdatedLongitude,
                ActivityLocation                                    = model.UpdatedLongitude
            };
            DATADB.UserActivityList.Add(SUCCESS);
            DATADB.SaveChanges();
            return RedirectToAction("ShippingAddresses");
        }
        var FAILURE                                                 = new UserActivities
        {
            UserID                                                  = userID,
            ActivityName                                            = "EditShippingAddress_Failure",
            ActivityTimeStampUTC                                    = nowUTC,
            ActivityLatitude                                        = model.UpdatedLatitude,
            ActivityLongitude                                       = model.UpdatedLongitude,
            ActivityLocation                                        = model.UpdatedLongitude
        };
        DATADB.UserActivityList.Add(FAILURE);
        DATADB.SaveChanges();
        return View(model);
    }
0 голосов
/ 21 мая 2018

Поместите этот код непосредственно перед вашим оператором if.

Я не выполнил код.Там могут быть некоторые синтаксические ошибки, но вы поняли.

if (model.IsDefaultShippingAddress)
{
   var addresses = DATADB.ShippingAddresses.Where(address => address.UserId == userId);

   addresses.ForEach(address => address.IsDefaultShippingAddress = false);
}
DATADB.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...