我的mvc ActionResult中有这个
[HttpPost]
public ActionResult _ChangeDetails( [Bind(Prefix="ContactDetails")] userDetail UserDetail )
{
MemberChangeDetailsFormViewModel fvm = new MemberChangeDetailsFormViewModel();
if (ModelState.IsValid)
{
//save
UserDetailRepository repository = new UserDetailRepository();
repository.Save(UserDetail);
return RedirectToAction("Index", "Member");
}
fvm.ContactDetails = UserDetail;
return View(fvm);
}然后在我的仓库里;
if (userDetail.id != Guid.Empty)
{
userDetail orig = dc.userDetails.Where(x => x.id == userDetail.id).Single();
dc.userDetails.Attach(userDetail, orig);
dc.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, userDetail);
dc.SubmitChanges();
}但是,“附加”正在生成错误;不能添加一个具有已在使用的密钥的实体。
据我所知,这是因为L2S已经附加了对象。我尝试过使用和不使用orig对象来完成这个操作,但是得到了相同的消息。
从模型中更新表中的数据的最佳做法是什么?
发布于 2011-03-27 02:36:04
Linq不能在相同的数据上下文中处理两个键相同的对象。一些备选方案:
选项1:使用两种不同的数据上下文:
public void Update(UserDetail modifiedUser)
{
using (UserDetailDataContext dc1 = new UserDetailDataContext())
using (UserDetailDataContext dc2 = new UserDetailDataContext())
{
UserDetail originalUser = dc1.UserDetails.Single(u => u.id == modifiedUser.id);
dc2.UserDetails.Attach(modifiedUser, originalUser);
dc2.SubmitChanges();
}
}选项2:不提取原始对象;将新对象注释为更新:
public void Update(UserDetail modifiedUser)
{
using (UserDetailDataContext dc = new UserDetailDataContext())
{
dc.UserDetails.Attach(modifiedUser);
dc.Refresh(RefreshMode.KeepCurrentValues, modifiedUser);
dc.SubmitChanges();
}
}在这个问题中还有更多的讨论,Rick有一个博客条目,它涵盖了基于版本的策略,如果您愿意修改表模式以添加时间戳的话。
https://stackoverflow.com/questions/5440746
复制相似问题