【问题标题】:MVC Entity Framework: update field for multiple records in tableMVC Entity Framework:更新表中多条记录的字段
【发布时间】:2018-05-20 12:50:02
【问题描述】:

我很难确定这是否只是一个设计问题和/或如何从编码角度解决以下情况:

在我的项目中,我允许用户添加多个送货地址。显然,其中之一应该是送货地址。但是,我想提供由用户自行决定更改此设置的可能性。 因此,我使用名为“IsDefaultShippingAddress”(布尔)的列存储了送货地址。我想做的是,当用户选择送货地址作为默认地址时,模型将为该列传递“true”。

现在,如果用户有一个现有的送货地址被选为默认地址,并想添加一个新的默认送货地址(或将现有送货地址提升为默认地址),我自然会以同一个用户在同一个表中有两个(多个)记录的场景,其中“IsDefaultShippingAddress”为“true” - 但我希望它只是一个地址(最新提升的地址),根据术语“默认”的性质。

因此我的问题是,如何确保所有符合特定条件(用户 ID)的记录都更新为 'IsDefaultShippingAddress' 'false',而新提升的送货地址(同一张表中的单独行)被设置为 @ 987654322@?

这是我的控制器代码,这是未解决问题的代码:

// 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);
    }

【问题讨论】:

    标签: asp.net-mvc entity-framework controller


    【解决方案1】:

    将此代码放在您的 if 语句之前。

    我还没有执行代码。可能有一些语法错误,但你明白了。

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

    【讨论】:

    • 谢谢@Selçuk - 这几乎可以工作.. 除了用户实际更改“IsDefaultShippingAddress”值的情况。最终会出现以下异常:
    • 附加类型为“freshNclean.Models.ShippingAddresses”的实体失败,因为另一个相同类型的实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后将非新实体的状态设置为“未更改”或“已修改”。
    【解决方案2】:

    感谢 Selçuk - 在您的帮助下,我走上了正确的道路。我有点曲折,现在我有了我的解决方案:

    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);
        }
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      相关资源
      最近更新 更多