我在我的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对象,但是得到相同的消息。
从模型更新表格中的数据的最佳做法是什么?
答案 0 :(得分:3)
Linq-to-SQL无法在同一数据上下文中处理具有相同键的两个对象。一些选择:
选项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();
}
}
this question中有更多讨论,如果您愿意修改表架构以添加时间戳,Rick Strahl会有blog entry涵盖基于版本控制的策略。