实体框架:存储实体而不保存到数据库
本文关键字:实体 保存 数据库 框架 存储 | 更新日期: 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 对新数据运行查询,需要保存。 您可以对列表进行列表,然后对列表运行查询,但这需要您将列表保存在某种静态内存(会话状态、视图状态、缓存)中,但如果列表很大,则可能会产生其他问题。
您可以在事务中执行所有操作。 传递事务,直到提交或回滚。实体对象被保存,但在事务回滚时,任何更改都将被撤消。 我认为事务将通过回发和重定向持续存在,但需要在呈现页面时提交或处置。