2015-02-10 109 views
0

我想使用下面的实体框架代码更新表中的字段,但它似乎不会修改该字段。这真令人沮丧,所以我想知道是否有人能告诉我我做错了什么?使用实体框架更新表

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

没有错误?至少你似乎没有提供newsBox的PK值,或者总是等于0的值。 – tschmit007 2015-02-10 13:02:50

+0

如果你从Update()函数中删除了try/catch,你会得到一个错误吗?另外,你能分享你的模式吗? – theduck 2015-02-10 17:53:15

回答

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( )。

如果这真的是您修改的唯一属性,只需将文本框的值作为字符串传递到Update函数而不是传递一个新的空(除了单个字段),您就可以节省一些开销并简化操作,目的。