因此,我正在开发一个将实体存储在 Session 变量中的现有应用程序,并且每次回发都尝试将其重新附加到新的上下文中。我并不特别关心这个实现,但现在重写它是不可能的。代码看起来像这样:
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 字段为假。
关于我应该如何解决这个问题的任何建议?我试过调用 .AttachTo("Reviews", review) 但我最终遇到了同样的错误。
到目前为止,我认为我知道的是,当我进行第一个 .Attach 调用时,它附加了“review”对象,但由于它是一个引用对象,它也修改了 Session 中的对象并向它添加了一个 EntityKey(我可能在这里我的术语或我的理解不正确——这对我来说是 EF 中的一个薄弱环节)。所以现在,在第一次回发之后,我的 Session 对象已经被“附加”了。第二次(当它失败时),它已经被附加了,所以它失败了?
我认为我在正确的轨道上,只是不确定如何从这里进行修复。理想情况下,我们不会这样做,但除非没有其他选择,否则可能不会在这里使用更正确的方法重写它。
任何建议表示赞赏。
编辑:我应该在有人回答之前提到这一点,但我无法在每次回发时返回数据库以获取评论。会话中的对象稍后会被修改,它的数据可能与数据库中的数据不同。