Asp.net mvc MVC实体框架:表中多条记录的更新字段
我正在努力定义这是否只是一个设计问题和/或如何从编码角度解决以下场景: 在我的项目中,我允许用户添加多个配送地址。显然,其中一个应该是送货地址。然而,我想提供的可能性,以改变这在用户的自由裁量权。 因此,我用一个名为“IsDefaultShippingAddress”(bool)的列存储了发货地址。我想做的是,当用户选择发货地址作为默认地址时,模型将为该列传递“true” 现在,在一个场景中,一个用户有一个选择为默认的现有配送地址,并且希望添加一个新的默认配送地址(或将现有配送地址升级为默认地址),我自然会在一个场景中结束,同一个用户有两个(多个)同一个表中的记录,其中“IsDefaultShippingAddress”为“true”-但根据术语“default”的性质,我希望它仅为单个地址(最新升级的地址) 因此,我的问题是,当新提升的发货地址(同一表中的单独行)被设置为Asp.net mvc MVC实体框架:表中多条记录的更新字段,asp.net-mvc,entity-framework,controller,Asp.net Mvc,Entity Framework,Controller,我正在努力定义这是否只是一个设计问题和/或如何从编码角度解决以下场景: 在我的项目中,我允许用户添加多个配送地址。显然,其中一个应该是送货地址。然而,我想提供的可能性,以改变这在用户的自由裁量权。 因此,我用一个名为“IsDefaultShippingAddress”(bool)的列存储了发货地址。我想做的是,当用户选择发货地址作为默认地址时,模型将为该列传递“true” 现在,在一个场景中,一个用户有一个选择为默认的现有配送地址,并且希望添加一个新的默认配送地址(或将现有配送地址升级为默认地址
'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”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。