2012-02-09 66 views
1

我一直在努力獲取字段值更改提交。有什麼明顯錯誤的位置:實體linq savechanges問題

<HttpPost()> 
Function Details(id As Guid?, model As RosterDetailModel) As ActionResult 
If model.Action = RosterDetailModel.ActionOption.Save Then 
    If model.Action = RosterDetailModel.ActionOption.Save Then 
     Dim invalid = False ' initalize able to save 
     'check validations 
     Dim sFirstname = IIf(model.NameFirst Is Nothing, String.Empty, model.NameFirst).ToString().Trim() 
     If sFirstname = String.Empty Then 
      invalid = True 
      ModelState.AddModelError("NameFirst", "First Name is required.") 
     End If 

     If invalid = False Then 
      'save is ok to do 
      Using db As New BCData() 
       Dim userModel As New RosterDetailModel(db, id) 
       'Dim userModel As New RosterDetailModel 
       'userModel = 
       userModel.NameFirst = sFirstname 
       'db.ApplyCurrentValues(userModel) 
       'db.AcceptAllChanges() 
       db.SaveChanges() 
       'userModel.SaveChanges(db, id, userModel) 
      End Using 
     End If 
    End If 
End If 
Return View(model) 
End Function 

我看到Entity Model Not Being Updated on SaveChanges有「但問題是,我引用了容器的不同實例(每個經理創建了自己的)。因此,實體項目未連接到任何東西。」 ..我不知道我到底需要改變什麼。當我試圖做一個Linq查詢並直接設置值時,它會告訴我該字段是隻讀的。

If invalid = False Then 
    'save is ok to do 
    Using db As New BCData() 
    'Dim userModel As New RosterDetailModel(db, id) 
    Dim userModel = From studentusers In db.studentusers _ 
    Where _ 
     studentusers.studentGuid = id _ 
    Select _ 
     studentusers.cellPhone, _ 
     studentusers.officePhone, _ 
     studentusers.phone, _ 
     studentusers.alternateEmail, _ 
     studentusers.country, _ 
     studentusers.zip, _ 
     studentusers.state, _ 
     studentusers.city, _ 
     studentusers.address2, _ 
     studentusers.address1, _ 
     studentusers.ForumeMailNotificationPreferences, _ 
     studentusers.magazineSubscribed, _ 
     studentusers.avatar, _ 
     studentusers.dateStudentActivated, _ 
     studentusers.dateDownloadOn, _ 
     studentusers.dateInstructorOn, _ 
     studentusers.instructor, _ 
     studentusers.ctcAdmin, _ 
     studentusers.download, _ 
     studentusers.accessLevel, _ 
     studentusers.datecreated, _ 
     studentusers.guidsignaturecookie, _ 
     studentusers.password, _ 
     studentusers.organization, _ 
     studentusers.email, _ 
     studentusers.lastname, _ 
     studentusers.firstname, _ 
     studentusers.groupGuid, _ 
     studentusers.studentGuid 


    db.Attach(userModel) 
    'Dim userModel As New RosterDetailModel 
    'userModel = 
    userModel.FirstOrDefault.firstname = sFirstname '**<- **** READ ONLY ???** 
       'db.ApplyCurrentValues(userModel) 
    'db.AcceptAllChanges() 

    db.SaveChanges() 
    'userModel.SaveChanges(db, id, userModel) 
End Using 

回答

1

重新加載userModel從數據庫中:

If invalid = False Then 
    Using db As New BlueCardData() 
     Dim userModel = (From studentuser In db.studentusers _ 
         Where studentuser.studentGuid = id _ 
         Select studentuser).Single() 
     'original userModel from DB is attached to context now 
     'change tracking will start from here 

     userModel.firstname = sFirstname 

     db.SaveChanges() 
     'EF detects change of firstname and will create UPDATE statement 
    End Using 

你的第二個代碼不能正常工作,因爲你是伸入匿名類型,你不能改變匿名類型的屬性。它們只是只讀的。

+0

感謝它在你的解決方案中工作 - 我錯過了我投影到匿名類型的細節。看起來代碼是相似的。 – phoenixAZ 2012-02-12 18:02:15

+0

@phoenixAZ:投影到匿名類型是你的'選擇studentusers.cellPhone,...'。你正在創建一個匿名對象。它與你的'StudentUser'實體具有相同的屬性,但它仍然是另一種類型。 – Slauma 2012-02-12 19:56:49