2011-05-10 236 views
6

如何将临时项存储在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

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

在这种情况下,你有一个新的HttpContext.Items集合,你的最后一个请求的值不见了。考虑在这种情况下使用会话来存储这些值。

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

+0

是的,SecondPage通过链接从FirstPage定位...尝试使用Session – asolovyov 2011-05-10 13:16:06

+0

它的工作原理!我通过httpContext.Session重新编写了HttpContextExtension。谢谢! – asolovyov 2011-05-10 14:16:47

+0

不错。无论如何:) – sra 2011-05-10 14:17:46

0

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

你可以做任何事情在TRANSACTION。通过交易直到您提交或回滚。实体对象得到保存,但是当事务回滚时,任何更改都会被撤消。我认为交易将通过回传和重定向来持续存在,但在页面呈现时需要承诺或处置。

+0

您的意思是“传递事务”==在页面之间传递它?我认为它只适用于一个EntityContext ... – asolovyov 2011-05-10 18:45:33

2

这是错误的做法,HttpContext只有一个HTTP请求的范围,所以你正在处理第二个请求中的不同上下文。

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

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

+0

-1该会话是实体框架对象的一个​​糟糕的解决方案。 EF只根据需要枚举,因此任何子对象都不会存在,并且当您调用EF的保存更改方法时,它将失败。 – Chad 2011-05-10 13:35:47

+0

据我所知,类实例只是一个没有其他依赖关系但没有附加到上下文的实体类,所以就像你可以在会话中保存其他任何类实例一样,你应该能够做同样的事情与这一个。我不太理解你的担心。 – BrokenGlass 2011-05-10 13:41:55

+0

他需要在第二页的查询中检索已更改的对象,我假定它将数据绑定到控件。 – Chad 2011-05-10 13:53:26