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 はステートレス プロトコルであるため、サーバーに要求を行うたびに、オブジェクト グラフをどこかに保持しない限り、オブジェクト グラフを再構築する必要があります。Web「セッション」全体でデータを永続化する方法は多数あります。ASP.NET では、Cookie、サーバー側セッション、viewstate、フォーム変数などにデータを格納できます。

まず、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ん。リクエストでクエリをまったく作成していないため、再クエリする必要はありません。ポストバック ハンドラーで再クエリを実行すると、更新のためにデータベースに 1 回アクセスするオーバーヘッドは、常に ViewState でシリアル化されたエンティティ全体を送信するオーバーヘッドよりもはるかに小さい可能性があります。

于 2012-07-01T14:26:25.057 に答える