2011-03-26 69 views
2

我有這個在我的MVC的ActionResult更新數據使用LINQ2SQL

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

但是「attach」正在產生一個錯誤; 無法添加已使用密鑰的實體。

我知道這是因爲L2S已經附加了對象。我曾嘗試過這樣做,但沒有使用orig對象,但得到相同的消息。

從模型更新表中的數據的最佳做法是什麼?

回答

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和裏克施特拉爾有blog entry,涵蓋了基於版本的策略,如果你願意修改表架構以添加時間戳。

+0

錯誤發生在「附加」,所以選項2不會工作,我不知道我想要第二個上下文。我應該採取originalUser,更新字段,然後提交更改?看起來有點落後於我 – griegs 2011-03-27 05:52:38

+1

格里格斯,你放在問題中的代碼失敗了,因爲它試圖用相同的鍵將兩個對象加載到上下文中:orig(使用Where/Single查詢)和userDetails(使用Attach。)Option 2工作,因爲它只加載一個這樣的對象:userDetails與附加。如果你還沒有真正嘗試過,你可能想要一試。 – 2011-03-27 06:26:38

+0

我已經試過它只有一個對象,我得到了同樣的結果。我嘗試了使用和不使用orig對象。 – griegs 2011-03-27 06:38:21