实体框架:存储实体而不保存到数据库

aso*_*yov 6 c# asp.net entity-framework httpcontext

如何在不保存到数据库的情况下在ObjectContext中存储临时项?

上下文存储在HttpContext中,按类提供:

public static class HttpContextExtension
{
    public static MyEntityDataModelContainer GetMyContext(this HttpContext httpContext)
    {
        if (httpContext.Items["MyEntityDataModelContainer"] == null)
        {
            httpContext.Items.Add("MyEntityDataModelContainer", new MyEntityDataModelContainer());
        }

        return (MyEntityDataModelContainer)httpContext.Items["MyEntityDataModelContainer"];
    }
}
Run Code Online (Sandbox Code Playgroud)

有两个空页:1)FirstPage.aspx.cs:

public class FirstPage : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // crete new item
        MyEntity newTemporaryItem = new MyEntity { MyEntityID = Guid.NewGuid() };
        // attach them to Context
        HttpContext.Current.GetMyContext().MyEntitySet.Attach(newTemporaryItem);
        // save changes
        HttpContext.Current.GetMyContext().SaveChanges();

        // get all attached to Context items
        var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged)
                          where se.Entity is MyEntity
                          select se.Entity).AsQueryable();
        int CountInFirstPage = addedItems.Count();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,CountInFirstPage = 1.

2)SecondPage.aspx.cs:

public class FirstPage : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // get added in First page items From HttpContext
        var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged)
                          where se.Entity is MyEntity
                          select se.Entity).AsQueryable();
        int CountInSecondPage = addedItems.Count();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里CountInSecondPage = 0.

哪里我错了?

sra*_*sra 3

我说得对吗,第二页是第二个请求?

在这种情况下,您将拥有一个新的 HttpContext.Items 集合,并且上次请求中的值将消失。在这种情况下,请考虑使用会话来存储这些值。

脚注: EntityContext 只能用于一个请求,因此可以存储在 HttpContext.Items 集合中,但绝不能作为 Session 值!此处仅存储结果(例如计数)。

  • [Julie Lerman](http://learnentityframework.com) 有一本关于 EntityFramework 4 的非常好的书,您应该阅读它。 (3认同)
  • 这不是什么新鲜事,我只需要引用 @BrokenGlass _但是即使可以以这种方式存储数据库上下文,即即使您决定将其存储在会话中 - 这不是要走的路 - 每个上下文的范围应该是一个单一的工作单元,您不应该让它长时间保持活动状态,尤其是在 Web 环境中。_ 在 Web 环境中保持 EntityContext 活动状态确实很糟糕。您应该**始终删除它**并仅存储稍后可能需要的结果。有太多的缺点不适合这个评论。 (2认同)
  • 当为每个请求设置新的 EntityContext 时,您不会损失太多性能。在您的示例中,您只需要下一个请求中的计数。您还可以将该值存储为链接中的 GET 参数,从而使您摆脱会话。这样,它们将在下一个视图中可用。在我看来,这将是适合您的情况的最干净的解决方案。该值准确存储在您需要的位置。无论是一个还是数百个 (2认同)