2015-12-30 89 views
1

當我單擊表單中的按鈕時,會創建一個新成員。 具有屬性的此新成員作爲參數傳遞給數據庫類 UpdateMember方法。context.SaveChanges()不會工作

在UpdateMember方法存在用於具有相同ID,然後在那個地方的部件的部件被替換爲在參數中傳遞的構件的搜索。

現在的問題是,成員名單現已更新,但context.SaveChanges不同意我的意見(它不更新數據庫)。

這是形式的代碼: db是DB類

private void updateMember() 
    { 
     Member mbr = new Member(); 
     mbr.membernr = int.Parse(nr.Text); 
     mbr.firstname = fName.Text; 
     mbr.lastname = lName.Text; 
     mbr.birthdate = Convert.ToDateTime(bDay.Text); 
     mbr.gender = gender.Text; 
     mbr.paid = int.Parse(paid.Text); 
     db.UpdateMember(mbr); 
    } 

這的實例數據庫類

class Db 
{ 
    private SportDBEntities context; 
    private static Db db; 
    private List<Member> members; 

    private Db() { 
     context = new SportDBEntities(); 
    } 

    public static Db GetInstance() { 
     if (db == null) { 
      db = new Db(); 
     } 
     return db; 
    } 

    public List<Member> GetMembers() { 
     members = new List<Member>(); 
     GetMembersFromDb(); 
     return members; 
    } 

    private void GetMembersFromDb() { 
     var query = context.Members; 
     foreach (Member m in query) { 
      members.Add(m); 
     } 
    } 

    public Member GetMemberAt(int index) 
    { 
     return members[index]; 
    } 

    public void UpdateMember(Member mbr) 
    { 
     for (int i = 0; i < members.Count; i++) 
     { 
      if (members[i].membernr==mbr.membernr) { 
       members[i] = mbr; 
      } 
     } 
     context.SaveChanges(); 
    } 
} 
+0

也許在'GetMembersFromDb()'方法中。您可以將斷點設置爲'query'並重試 –

+0

已經嘗試過。如果我記錄什麼context.SaveChanges它返回0.零意味着顯然沒有改變。 –

+0

這很可能是因爲上下文不知道對象的狀態已更改 - 可能仍然設置爲「未更改」。考慮下面這行代碼讓你的上下文知道對象已經改變了:'context.Entry(/ *你的對象在這裏* /)。State = EntityState.Modified;'你可以在這裏閱讀:https://msdn.microsoft .com/en-us/library/system.data.entitystate(v = vs.110).aspx –

回答

1

其實你是不是從上下文更新實例,而是完全用存儲在mbr變量中的未連接/瞬態對象替換它。

var existingMbr = members[i]; 
existingMbr.firstname = mbr.firstname; 
existingMbr.lastname = mbr.lastname; 
existingMbr.birthdate = mbr.birthdate ; 
existingMbr.gender = mbr.gender; 
existingMbr.paid = mbr.paid; 

由於existingMbr被跟蹤的情況下應該檢測到變化

BTW,當你更新敏感數據membernr你一定要小心。它可能對您的業務有重要意義。

+0

這確實是個問題,上下文無法跟蹤這些更改。感謝您的幫助:) 順便說一句,membernr是不可更改的,表單上的這個字段是隻讀的,僅供參考。 –