使用实体框架更新表

时间:2015-02-10 11:14:02

标签: vb.net 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

1 个答案:

答案 0 :(得分: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来识别具有特定行的给定对象),那么它最终会插入一个新行,但是你可能永远都看不到它,因为你只获得了一个)。

通过简单地将文本框的值作为字符串传递给Update函数而不是传递新的空(除单个字段)对象,您可以节省一些开销并使其更简单,如果这确实是您修改的唯一属性