使用Linq2Sql更新数据

时间:2011-03-26 06:32:35

标签: asp.net-mvc linq-to-sql

我在我的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对象,但是得到相同的消息。

从模型更新表格中的数据的最佳做法是什么?

1 个答案:

答案 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涵盖基于版本控制的策略。