そのため、エンティティをセッション変数に格納する既存のアプリケーションに取り組んでおり、すべてのポストバックがそれを新しいコンテキストに再アタッチしようとします。この実装は特に気にしませんが、書き直すことは今のところ問題外です。コードは次のようになります。
public partial class ReviewDetail
{
DBContext context = new DBContext();
public void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
int id = Convert.ToInt32(Request.QueryString["id"]);
Session["Review"] = context.Reviews.FirstOrDefault(x => x.ReviewID = id);
}
else
{
Review review = Session["Review"] as Review;
context.Attach(review);
}
}
}
これは、最初のページ読み込みと最初のポストバックの両方で機能します。ただし、その後のポストバックでは、次のエラーで失敗します。
一時的な EntityKey 値を持つオブジェクトは、オブジェクト コンテキストにアタッチできません。
とにかく奇妙なことは、VS デバッガーでコードをステップ実行し、review.EntityKey のプロパティを調べると、IsTemporary フィールドが false であることです。
これを修正する方法について何か提案はありますか? .AttachTo("Reviews", review) を呼び出してみましたが、同じエラーが発生します。
私がこれまでに知っていると思うのは、最初の .Attach 呼び出しを行うと、「レビュー」オブジェクトがアタッチされますが、それは参照オブジェクトであるため、Session 内のオブジェクトも変更され、それに EntityKey が追加されるということです (おそらくここでの私の用語または私の理解が間違っています-これは私にとってEFの少し弱い領域です)。これで、最初のポストバックの後、Session オブジェクトが「アタッチ」されました。2回目(失敗時)は既に付いているので失敗?
ここから修正にアプローチする方法がわからないだけで、正しい軌道に乗っていると思います。理想的には、このようにすることはありませんが、他の方法がない限り、より正しいアプローチを使用するように書き直すことはおそらくここでは行われません。
任意の提案をいただければ幸いです。
編集:誰かが回答する前にこれについて言及する必要がありましたが、ポストバックごとにデータベースに戻ってレビューを取得することはできません。セッション内のオブジェクトは後で変更され、そのデータは DB 内のデータとは異なる可能性があります。