如何在多个ASP.NET请求中更新EF中的实体而不再检索它?

Jar*_*tte 5 linq vb.net asp.net entity-framework

听起来很简单吧?这是场景......

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
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*ver 1

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

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

dbQuery.Detach(CurrentCoral)
Run Code Online (Sandbox Code Playgroud)

然后将其放入像视图状态这样的数据存储中。

Me.ViewState.Add("CurrentCoral", CurrentCoral)
Run Code Online (Sandbox Code Playgroud)

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

CurrentCoral = CType(Me.ViewState("CurrentCoral"), Coral)
dbQuery.Attach(CurrentCoral)
CurrentCoral.CommonName = strName
dbQuery.SaveChanges()
Run Code Online (Sandbox Code Playgroud)

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

附加和分离对象