1

そのため、エンティティをセッション変数に格納する既存のアプリケーションに取り組んでおり、すべてのポストバックがそれを新しいコンテキストに再アタッチしようとします。この実装は特に気にしませんが、書き直すことは今のところ問題外です。コードは次のようになります。

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 内のデータとは異なる可能性があります。

4

2 に答える 2

2

セッション変数からエンティティを取得し、そのIDプロパティを使用して、次のようにコンテキストを再クエリします。

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;

            Review updateReviewFromContext = context.ApplyCurrentValues<Review>("Reviews", review);         
        }
    }
}

これは単純な変更であり、オブジェクト全体をセッションに格納することとは少し関係がありませんが、変更できない場合は、これでうまくいくはずです。

アップデート

参照: http: //msdn.microsoft.com/en-us/library/dd487246

は、セッションからApplyCurrentValues更新をReview取得し、その更新されたプロパティをコンテキストから返されるエンティティに適用します。唯一の秘訣は、私の例の「レビュー」では、それが何であるかを知る必要があることですがEntitySetName、それが変わらない限り、ハードコーディングすることができます。

于 2012-06-11T18:40:33.837 に答える
1

これらの問題は通常、オブジェクトをアタッチするときの Entity Framework の動作の結果です。エンティティをアタッチすると、エンティティが参照するすべてのエンティティが再帰的にアタッチされます。多くの場合、問題は暗黙的にアタッチされているエンティティにあるのに、エラーは明示的にアタッチしているエンティティにあると当然想定しているため、例外は誤解を招きます。

そのため、コード スニペットがどの程度省略されているかはわかりませんが、新しく作成されたエンティティを参照しているエンティティをアタッチしようとしているようです。

于 2012-06-11T19:09:22.257 に答える