2012-05-08 39 views
2

我想用一個值更新更新用戶表,但我無法弄清楚我做錯了什麼。這是我有什麼:使用LINQ上下文更新記錄?

public static void ApplyROB(string ROBread, string userName) 
     { 
      using (SERTEntities ctx = CommonSERT.GetSERTContext()) 
      { 
        // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= 
        // Audit of the transfer 
       datUser trUser = new datUserRole(); 
       trUser.ROB = ROBread; 
       trUser.AccountName = userName; 
       // Persist update to DB 
       ctx.SaveChanges(); 

      } 
     } 

我是否離開?當我點擊更新時沒有任何反應。 我怎麼說,在哪裏用戶名=用戶名?我做對了嗎?

基本上需要一個簡單的:

update datUser set ROB = "Y" where AccountName= "myusername" 

它的轉向了更復雜一些在LINQ使用上下文

請幫助。

回答

5

您並未將新實體添加到上下文,因此在保存時上下文不知道任何更改。你需要這樣的東西......

ctx.datUserRoles.Add(datUserRole) 

做一個更新,則需要中檢索從上下文的實體,進行更改,然後保存......這樣:

var entity=ctx.datUserRoles.SingleOrDefault(dur=>dur.AccountName==someUserName); 
if(entity!=null) 
{ 
    entity.someProp=someVal; 
    ctx.SaveChanges(); 
} 
else 
{ 
    throw new UnexpectedOperationException(); //or however you want to fail 
} 
+0

現在我收到錯誤。我必須走在正確的道路上(在沒有任何事情發生之前),但我怎麼知道這是做更新還是插入? –

+0

你需要做更新?看修改後的答案... – spender

+0

大獲成功!感謝大家的幫助! –

2

如果您需要更新。也許是這樣的:

public static void ApplyROB(string ROBread, string userName) 
{ 
    using (SERTEntities ctx = CommonSERT.GetSERTContext()) 
    { 
     var trUser= ctx.datUserRole.Where(a=>a.AccountName==userName) 
            .FirstOrDefault(); 
     if(trUser!=null) 
     { 
      trUser.ROB = ROBread; 
      ctx.SaveChanges(); 
     } 
    } 
} 

如果你確信你將永遠有一些更新,您可以使用First()。然後,你不需要檢查trUsernull

+0

謝謝! a => a - 是我需要替換的變量,還是隻是將它保留爲? –

+0

這是一個linq表達式。所以是的,你需要它 – Arion

+0

謝謝,謝謝!看起來像我懂了! –

1

花錢是正確的在某種意義上,在另一個不正確:要更新現有記錄。

對於您需要先選擇記錄,例如:

var user = 
    (from u in ctx.datUserRoles 
    where u.AccountName == "accountname" 
    select u).FirstOrDefault(); 

哪裏accountname是同一類型的有效的事情 - 這也不要緊,因爲你可以選擇它如何想要,您可以觸摸它以符合您的標準。然後,一旦你有該項目做的東西:

if (user != null) { 
    user.ROB = ROBread; 
    ctx.SaveChanges(); 
} 
+2

Yay爲「splender」!仔細閱讀......這實際上是「花錢」! – spender

+1

@spender我合法地抱歉。不要吝嗇冒犯。 –