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

时间:2011-05-10 13:06:39

标签: 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"];
    }
}

有两个空白页面: 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();
    }
}

所以, 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();
    }
}

此处 CountInSecondPage = 0。

我哪里错了?

3 个答案:

答案 0 :(得分:3)

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

在这种情况下,你有一个新的HttpContext.Items集合,你上一次请求的值都消失了。在这种情况下,请考虑使用会话来存储这些值。

脚注: EntityContext应仅用于一个请求,并且出于该原因可以存储在HttpContext.Items集合中,但从不作为Session值存储!在这里存储结果就像计数一样。

答案 1 :(得分:2)

这是错误的方法,HttpContext只有一个HTTP请求的范围,因此您在第二个请求中处理不同的上下文。

但即使有可能以这种方式存储数据库上下文,即使你决定将它存储在Session中 - 这不是要走的路 - 每个上下文的范围应该是一个单独的工作单元,你不应该长时间保持活着,特别是在网络环境中。

直接在会话中保存临时项目,并在准备好时创建新的上下文以上传这些项目。

答案 2 :(得分:0)

要使用EF对新数据运行查询,您需要保存。您可以列出然后列表然后对列表运行查询,但这将要求您将列表保留在某种静态内存(会话状态,视图状态,缓存)中,但如果列表很大,可能会产生其他问题。

你可以在TRANSACTION中完成所有事情。传递事务直到您提交或回滚。实体对象将被保存,但当事务回滚时,任何更改都将被撤消。我认为交易将通过回发和重定向持续存在,但需要在呈现页面时提交或处理。