如何在不保存到数据库的情况下在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。
我哪里错了?
答案 0 :(得分:3)
我是对的,第二页是第二个请求吗?
在这种情况下,你有一个新的HttpContext.Items集合,你上一次请求的值都消失了。在这种情况下,请考虑使用会话来存储这些值。
脚注: EntityContext应仅用于一个请求,并且出于该原因可以存储在HttpContext.Items集合中,但从不作为Session值存储!在这里存储结果就像计数一样。
答案 1 :(得分:2)
这是错误的方法,HttpContext
只有一个HTTP请求的范围,因此您在第二个请求中处理不同的上下文。
但即使有可能以这种方式存储数据库上下文,即使你决定将它存储在Session中 - 这不是要走的路 - 每个上下文的范围应该是一个单独的工作单元,你不应该长时间保持活着,特别是在网络环境中。
直接在会话中保存临时项目,并在准备好时创建新的上下文以上传这些项目。
答案 2 :(得分:0)
要使用EF对新数据运行查询,您需要保存。您可以列出然后列表然后对列表运行查询,但这将要求您将列表保留在某种静态内存(会话状态,视图状态,缓存)中,但如果列表很大,可能会产生其他问题。
你可以在TRANSACTION中完成所有事情。传递事务直到您提交或回滚。实体对象将被保存,但当事务回滚时,任何更改都将被撤消。我认为交易将通过回发和重定向持续存在,但需要在呈现页面时提交或处理。