每组操作的可重用 ObjectContext 还是新的 ObjectContext?

     2023-02-24     57

关键词:

【中文标题】每组操作的可重用 ObjectContext 还是新的 ObjectContext?【英文标题】:Reuseable ObjectContext or new ObjectContext for each set of operations? 【发布时间】:2010-11-18 02:59:45 【问题描述】:

我是实体框架的新手,我刚开始在空闲时间玩弄它。我遇到的主要问题之一是关于如何处理 ObjectContexts。

以下是通常首选/推荐的:

这个

public class DataAccess

    MyDbContext m_Context;

    public DataAccess()
        m_Context = new MyDbContext();        
    

    public IEnumerable<SomeItem> GetSomeItems()
        return m_Context.SomeItems;
    

    public void DeleteSomeItem(SomeItem item)
        m_Context.DeleteObject(item);
        m_Context.SaveChanges();
    

还是这个?

public class DataAccess

    public DataAccess() 

    public IEnumerable<SomeItem> GetSomeItems()
        MyDbContext context = new DbContext();
        return context.SomeItems;
    

    public void DeleteSomeItem(SomeItem item)
        MyDbContext context = new DbContext();
        context.DeleteObject(item);
        context.SaveChanges();
    

【问题讨论】:

与***.com/questions/1072391/…有些关系 还有这个...***.com/questions/226127虽然讨论的是Linq2Sql,但同样适用。 【参考方案1】:

ObjectContext 是“工作单元”。

基本上这意味着对于每个“操作”(例如:每个网页请求)都应该有一个新的 ObjectContext 实例。在该操作中,应该重复使用相同的 ObjectContext。

仔细想想,这是有道理的,因为事务和更改提交都与 ObjectContext 实例相关联。

如果您不是在编写 Web 应用程序,而是在编写 WPF 或 Windows 窗体应用程序,它会变得有点复杂,因为您没有网页那样的“请求”范围- load 给了你,但你明白了。

PS:在您的任何一个示例中,ObjectContext 的生命周期都将是全局的或瞬态的。在这两种情况下,它都不应该存在于 DataAccess 类中 - 它应该作为依赖项传入

【讨论】:

【参考方案2】:

如果您为 long-running 进程对它运行 lots 查询 保持相同的上下文,linq-to-sql(我没有针对 linq to entity 进行测试,但我想这是同样的问题)变得非常慢(大约 1000 个简单查询后每秒 1 个查询)。定期更新上下文可以解决这个问题,而且不会花费太多。

发生的情况是上下文会跟踪您对其执行的每个查询,所以如果它没有以某种方式重置,它会变得非常胖......其他问题是它占用的内存。

因此,这主要取决于您的应用程序的工作方式,以及您是否定期更新 DataAccess 实例,或者是否一直保持不变。 希望这会有所帮助。

史蒂芬

【讨论】:

【参考方案3】:

只是一个简短的说明 - 两个代码片段在其潜在问题上大致相同。这是我一直在研究的内容,因为您不想在不确定是否可以信任 Microsoft 为您正确处理上下文的同时继续打开和关闭上下文(参见第二个示例)。

我所做的其中一件事是创建一个公共基类,该基类延迟加载上下文并实现基类 destruct-er 来处理事物。这对于像 MVC 框架这样的东西很有效,但不幸的是导致了必须将上下文传递到各个层以便业务对象可以共享调用的问题。

最后我使用 Ninject 将这个依赖注入到每一层并让它跟踪使用情况

【讨论】:

微软建议不要使用长时间运行的 DataContexts 或 ObjectContexts。它会降低性能并使对象跟踪复杂化。【参考方案4】:

虽然我不赞成每次需要时总是创建复杂的对象,但我也发现 Linq to Sql 中的 DataContexts 和 EF 中的 ObjectContexts 最好在需要时创建。

p>

这两者都基于您运行它们的模型执行大量静态初始化,这些模型被缓存以供后续调用,因此您会发现上下文的初始启动将比所有后续实例化更长。

您面临的最大障碍是,一旦您从上下文中获取了一个实体,您就不能简单地将它传递回另一个实体以执行更新操作,或者重新添加相关实体。在 EF 中,您可以重新附加一个实体回到一个新的上下文。在 L2S 中,这个过程几乎是不可能的。

【讨论】:

因此——我总是在 datacontext/objectcontext 周围有一个 using 语句,并将所有数据操作推入其中;我的上下文总是尽可能短暂。

Gatsby 具有自己查询的可重用组件

...组件的最“耦合”方式是什么?我似乎找不到任何执行此操作的示例,并且在文档中找不到任何内容。例如,您想为博客制作一个标签云组件,该组件将显示在所 查看详情

组合中的可重用发布者(订阅?)

...(with:completionHandler)实现后台下载,我需要执行完全相同的操作。所以下面代码中的所 查看详情

如何将部分更新操作从 ObjectContext 转换为 DbContext

】如何将部分更新操作从ObjectContext转换为DbContext【英文标题】:HowtotransitionpartialupdateoperationfromObjectContexttoDbContext【发布时间】:2017-10-0510:21:06【问题描述】:我正在使用实体框架5.0。我正在将我的应用程序从ObjectContext更改为Db... 查看详情

带有 UICollectionViewCell 的可重用 UITableViewCell

】带有UICollectionViewCell的可重用UITableViewCell【英文标题】:ReusableUITableViewCellwithUICollectionViewCell【发布时间】:2018-09-2010:53:02【问题描述】:代码:functableView(_tableView:UITableView,cellForRowAtindexPath:IndexPath)->UITableViewCell 查看详情

React 中的可重用文本字段

】React中的可重用文本字段【英文标题】:ReusableTextFieldinReact【发布时间】:2021-01-0906:01:29【问题描述】:我在React的MaterialUI中使用了可重用的TextField,但我在使用条件时遇到了问题。如果没有传递给它,我不需要使用InputLabelPro... 查看详情

UICollectionViewCompositionalLayout 的可重用标头

】UICollectionViewCompositionalLayout的可重用标头【英文标题】:ReusableheadersforUICollectionViewCompositionalLayout【发布时间】:2021-12-3107:34:49【问题描述】:我正在尝试为我的UICollectionViewCompositionalLayout中的每个部分创建描述性标题。像这样... 查看详情

QML中的可重用字体属性[重复]

】QML中的可重用字体属性[重复]【英文标题】:ReusablefontpropertiesinQML[duplicate]【发布时间】:2016-05-2715:40:51【问题描述】:在QML中,我希望能够为简单的语义重用定义一组字体属性。例如,而不是:Texttext:"Thisisaheader"fontfamily:\'Enco... 查看详情

Eclipse/Android 中的可重用项目

】Eclipse/Android中的可重用项目【英文标题】:ReusableProjectsinEclipse/Android【发布时间】:2011-05-3100:31:34【问题描述】:我是Eclipse开发新手(适用于Android)。多年来,我一直是使用VisualStudio的.Net开发人员。我很高兴现在可以尝试一... 查看详情

List 中的可重用性支持 - SwiftUI

】List中的可重用性支持-SwiftUI【英文标题】:ReusabilitysupportinList-SwiftUI【发布时间】:2021-07-2706:30:03【问题描述】:我目前正在开发一个使用SwiftUI的项目。我试图使用List来显示一个包含10个项目的列表。问题:List是否像UITableview... 查看详情

UICollectionView 上的可重用性问题

】UICollectionView上的可重用性问题【英文标题】:ReusabilityissueonUICollectionView【发布时间】:2014-03-2705:15:06【问题描述】:我曾使用过UITableView,但我从未在我的应用程序中使用过UICollectionView。所以我想以编程方式创建UICollectionView... 查看详情

React 中的可重用组件

】React中的可重用组件【英文标题】:ReusableComponentinReact【发布时间】:2021-10-0114:01:25【问题描述】:我想使用Styled-Components在我的React应用程序中创建一个可重用的组件。我的问题是我得到了错误错误:元素类型无效:应为字符... 查看详情

ObjectContext 实例已被释放,不能再用于需要连接的操作。在参考表中

】ObjectContext实例已被释放,不能再用于需要连接的操作。在参考表中【英文标题】:TheObjectContextinstancehasbeendisposedandcannolongerbeusedforoperationsthatrequireaconnection.inReferencetable【发布时间】:2014-03-2706:03:55【问题描述】:我有两个表Cu... 查看详情

具有委托方法的可重用 UIPickerView

】具有委托方法的可重用UIPickerView【英文标题】:ResuableUIPickerViewwithdelegatemethod【发布时间】:2017-03-2810:40:59【问题描述】:我想要一个可重用的UIPickerView,其中填充了来自互联网的JSON对象。问题是如何在不同的控制器中使用选... 查看详情

如何在 Blazor 的可重用表组件中显示数据

】如何在Blazor的可重用表组件中显示数据【英文标题】:HowtodisplaydatainareusableTablecomponentinBlazor【发布时间】:2021-06-0113:35:07【问题描述】:我正在尝试在Blazor中创建一个可重用的MasterTable组件。到目前为止,我已将MasterTable定义... 查看详情

如何停止 UIPickerView 的可重用性

】如何停止UIPickerView的可重用性【英文标题】:howtostopUIPickerViewreusability【发布时间】:2013-04-2320:08:23【问题描述】:我正在开发自定义PickerView,我在选择器中有两个组件(小时、分钟),我已将分钟组件中的“0”设为灰色且... 查看详情

UITableView 单元格中的可重用单元格存在问题

】UITableView单元格中的可重用单元格存在问题【英文标题】:HavingissueinreuseablecellinUITableViewcell【发布时间】:2017-02-2313:03:55【问题描述】:我在单个UITableViewCell中有两种设计。这是我在加载viewController时想要并得到的设计但滚动... 查看详情

n 层项目中的实体框架 ObjectContext 生命周期

】n层项目中的实体框架ObjectContext生命周期【英文标题】:EntityFrameworkObjectContextlifetimeinann-tierproject【发布时间】:2015-06-3016:36:34【问题描述】:我目前正在为客户构建一个大型解决方案,其中代码可重用性是关键字,因为不同... 查看详情

我们能否增加这种面向密钥的访问保护模式的可重用性?

】我们能否增加这种面向密钥的访问保护模式的可重用性?【英文标题】:Canweincreasethere-usabilityofthiskey-orientedaccess-protectionpattern?【发布时间】:2011-03-2011:43:08【问题描述】:我们能否提高thiskey-orientedaccess-protectionpattern的可重用... 查看详情