5

听起来很容易,对吧?这是场景...

Private dbQuery As New ReefEntities

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        CurrentCoral = (From c In dbQuery.Corals Where c.CoralID = intCoralID).FirstOrDefault
       txtCommonName.Text = CurrentCoral.CommonName
    End If
End Sub

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
    'how do I access the coral from the page load to update it?
   CurrentCoral.CommonName = strName
   dbQuery.SaveChanges()
End Sub

我不想重新查询我的结果,我想从页面加载更新查询,然后保存更改,对吗?如何访问该原始对象以更新它?

4

3 回答 3

1

HTTP 是一种无状态协议,因此,您向服务器发出的每个请求都需要重建您的对象图,除非您将其持久化到某个地方。有很多方法可以在网络“会话”中保存数据。在 ASP.NET 中,您可以将数据存储在 cookie、服务器端会话、视图状态、表单变量等中。

首先,当您在 Page_Load 中完成 CurrentCoral 时,您会将其从对象上下文中分离出来

dbQuery.Detach(CurrentCoral)

然后把它放在像视图状态这样的数据存储中。

Me.ViewState.Add("CurrentCoral", CurrentCoral)

在单击保存按钮时的下一个 Web 请求中,从视图状态检索实体并将其附加到新对象上下文。

CurrentCoral = CType(Me.ViewState("CurrentCoral"), Coral)
dbQuery.Attach(CurrentCoral)
CurrentCoral.CommonName = strName
dbQuery.SaveChanges()

请原谅任何语法错误。VB.NET 不是我的第一语言!有关使用 Entity Framework 附加和分离实体的更多详细信息,请参阅以下文章。

附加和分离对象

于 2012-07-01T04:59:03.883 回答
1

您可以将 CurrentCoral 对象放入 ViewState 或 Session,然后在 Click 事件中检索它。

 Dim oCurrentCorral as Object = ViewState("CurrentCoral")
 dbQuery.ObjectStateManager.ChangeObjectState(oCurrentCoral, System.Data.EntityState.Added)
 dbQuery.SaveChanges()
于 2012-07-01T05:02:56.193 回答
0

如果请求是回发,则根本不会加载记录Page_Load——没有什么可重新查询的,因为您根本没有在请求中进行查询。我想说只是在回发处理程序中重新查询,一次更新数据库的开销可能远小于始终发送在 ViewState 中序列化的整个实体的开销。

于 2012-07-01T14:26:25.057 回答