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

本文关键字:实体 保存 数据库 框架 存储 | 更新日期: 2023-09-27 17:55:42

如何在不保存到数据库的情况下将临时项目存储在 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) 首页.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();
    }
}

因此,计数第一页 = 1。

2)第二页.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();
    }
}

此处计数秒页 = 0。

我错在哪里?

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

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

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

脚注:EntityContext 只能用于一个请求,并且可以因此存储在 HttpContext.Items 集合中,但绝不能作为会话值!像计数一样将结果存储在这里。

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

但是,即使可以以这种方式存储数据库上下文,即即使您决定将其存储在会话中 - 这不是要走的路 - 每个上下文的范围应该是单个工作单元,您也不应该长时间保持活动状态,尤其是在 Web 环境中。

只需直接在会话中保存临时项目,并在准备就绪时创建一个新上下文以上传这些项目。

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

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