Asp.net mvc MVC实体框架:表中多条记录的更新字段

Asp.net mvc MVC实体框架:表中多条记录的更新字段,asp.net-mvc,entity-framework,controller,Asp.net Mvc,Entity Framework,Controller,我正在努力定义这是否只是一个设计问题和/或如何从编码角度解决以下场景: 在我的项目中,我允许用户添加多个配送地址。显然,其中一个应该是送货地址。然而,我想提供的可能性,以改变这在用户的自由裁量权。 因此,我用一个名为“IsDefaultShippingAddress”(bool)的列存储了发货地址。我想做的是,当用户选择发货地址作为默认地址时,模型将为该列传递“true” 现在,在一个场景中,一个用户有一个选择为默认的现有配送地址,并且希望添加一个新的默认配送地址(或将现有配送地址升级为默认地址

我正在努力定义这是否只是一个设计问题和/或如何从编码角度解决以下场景:

在我的项目中,我允许用户添加多个配送地址。显然,其中一个应该是送货地址。然而,我想提供的可能性,以改变这在用户的自由裁量权。 因此,我用一个名为“IsDefaultShippingAddress”(bool)的列存储了发货地址。我想做的是,当用户选择发货地址作为默认地址时,模型将为该列传递“true”

现在,在一个场景中,一个用户有一个选择为默认的现有配送地址,并且希望添加一个新的默认配送地址(或将现有配送地址升级为默认地址),我自然会在一个场景中结束,同一个用户有两个(多个)同一个表中的记录,其中“IsDefaultShippingAddress”为“true”-但根据术语“default”的性质,我希望它仅为单个地址(最新升级的地址)

因此,我的问题是,当新提升的发货地址(同一表中的单独行)被设置为
'IsDefaultShippingAddress''true'时,如何确保符合特定条件(UserID)的所有记录更新为
'IsDefaultShippingAddress''false'

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

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

将此代码放在if语句之前

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

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

   addresses.ForEach(address => address.IsDefaultShippingAddress = false);
}
DATADB.SaveChanges();

谢谢你的帮助,我走上了正确的道路。我经历了一些曲折,现在我有了我的解决方案:

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

谢谢@Selçuk-这几乎奏效了。。用户实际更改“IsDefaultShippingAddress”值的情况除外。这将导致以下异常:附加“freshNclean.Models.ShippingAddresses”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。