2015-02-10 3 views
0

Я пытаюсь обновить поле в таблице, используя следующий код Entity Framework, но он просто не изменит это поле. Это действительно расстраивает, поэтому я подумал, может ли кто-нибудь сказать мне, что я делаю неправильно?Обновление таблицы с использованием структуры сущности

default.aspx.vb:

Protected Sub btn_Save_Click(sender As Object, e As System.EventArgs) Handles btn_Save.Click 
     SaveNewsBox() 
    End Sub 

    Private Sub GetNewsBox() 
     Dim newsBox As GLC.Home = BLL.Homes.Homes.GetNewsBox() 
     If newsBox IsNot Nothing Then 
      txt_NewsBox.Text = newsBox.NewsBox 
     End If 
    End Sub 

    Private Sub SaveNewsBox() 

     Dim newsBox As New GLC.Home 

     newsBox.NewsBox = txt_NewsBox.Text 

     If BLL.Homes.Homes.Update(newsBox) Then 
      Master.AlertStyle = "alert-success" 
      Master.AlertMessage = "<i class=""fa fa-thumbs-o-up""></i> Meal details saved, <a href=""/secure/"">return to main menu.</a>" 
      Master.AlertVisible = True 
     Else 
      Master.AlertStyle = "alert-danger" 
      Master.AlertMessage = "<i class=""fa fa-thumbs-o-down""></i> Warning news box details could not be saved.</a>" 
      Master.AlertVisible = True 
     End If 

    End Sub 
End Class 

Homes.vb:

Imports DAL 
Imports GLC 

Namespace Homes 
    Public Class Homes 
     Public Shared Function GetNewsBox() As Home 
      Return MethodClasses.HomesHandler.GetNewsBox() 
     End Function 

     Public Shared Function Update(newsBox As Home) As Boolean 
      Return MethodClasses.HomesHandler.Update(newsBox) 
     End Function 

    End Class 
End Namespace 

HomesHandler.vb:

Imports GLC 
Imports System.Linq.Dynamic 

Namespace MethodClasses 
    Public Class HomesHandler 

     Public Shared Function GetNewsBox() As Home 
      Using context As New GLCContext 
       Try 
        Return context.Homes.Single() 
       Catch ex As Exception 
        Return Nothing 
       End Try 
      End Using 
     End Function 

     Public Shared Function Update(newsBox As Home) As Boolean 
      Dim newsBoxUpdated As Boolean = False 
      Using context As New GLCContext 
       Try 
        context.Homes.Attach(newsBox) 
        Dim entry = context.Entry(newsBox) 
        entry.State = EntityState.Modified 

        context.SaveChanges() 
        newsBoxUpdated = True 

       Catch ex As Exception 
        newsBoxUpdated = False 
       End Try 
      End Using 

      Return newsBoxUpdated 

     End Function 

    End Class 
End Namespace 
+0

Ошибка? По крайней мере, вы, кажется, не предоставляете значение PK для newsBox или значение, всегда равное 0. – tschmit007

+0

Если вы удалите попытку/улов из своей функции Update(), вы получите сообщение об ошибке? Кроме того, вы можете поделиться своей схемой? – theduck

ответ

0

Что я предполагаю, что случается, когда вы звоните Dim entry = context.Entry(newsBox) выдает исключение и возвращает false, так как этот объект является новым, созданным в aspx, и он не может найти Это.

Похоже, что в вашей таблице есть только одна запись (или вы предоставляете только способ получить первую строку). Если это так, то я бы просто сделать это:

Public Shared Function Update(newsBox As Home) As Boolean 
      Dim newsBoxUpdated As Boolean = False 
      Using context As New GLCContext 
       Try 
        Dim entry = GetNewsBox() 
        entry.NewsBox = newsBox.NewsBox 

        context.SaveChanges() 
        newsBoxUpdated = True 

       Catch ex As Exception 
        newsBoxUpdated = False 
       End Try 
      End Using 

      Return newsBoxUpdated 

     End Function 

Контекст будет знать, что объект изменяется (так как вы изменили его в то время как он был прикреплен). Если вы вызываете Attach() без ключа (или каким-либо образом для EF, чтобы идентифицировать данный объект с определенной строкой), тогда он будет вставлять новую строку, но вы, вероятно, никогда не увидите ее, потому что вы только когда-либо получаете Single ().

Вы можете сохранить некоторые накладные расходы и упростить их, если это действительно единственное свойство, которое вы изменяете, просто передав значение текстового поля в виде строки в функцию обновления вместо передачи нового, пустого (за исключением одного поля) объект.

Смежные вопросы