我正在尝试使用以下实体框架代码更新表中的字段,但它似乎不会修改该字段。这真是令人沮丧所以我想知道是否有人可以告诉我我做错了什么?
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 :(得分: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函数而不是传递新的空(除单个字段)对象,您可以节省一些开销并使其更简单,如果这确实是您修改的唯一属性