实体框架和多线程

2024-02-20

我们在设计多线程实体框架驱动的应用程序时遇到一些问题,需要一些指导。我们在不同的线程上创建实体,将实体添加到集合中,然后将集合数据绑定到各种 WPF 控件。 ObjectContext 类不是线程安全的,因此管理它我们基本上有 2 个解决方案:

解决方案 1 有一个上下文,并小心地使用锁定来确保没有 2 个线程同时访问它。这实现起来相对简单,但需要上下文在应用程序的持续时间内保持活动状态。像这样打开单个上下文实例是一个坏主意吗?

解决方案 2 是按需创建上下文对象,然后立即分离对象,然后将它们保存在我们自己的集合中,然后重新附加它们以进行任何更新。但这在使用中存在一些严重的问题,因为当对象分离时,它们会丢失对导航属性对象的引用。还有一个问题是,两个线程仍然可以尝试访问单个对象,并且都尝试将其 Attach() 到上下文。此外,每次我们想要访问实体的导航属性时,我们都需要提供一个新的上下文。

问:这两种解决方案是否有效?如果无效,您建议我们如何解决这个问题?


首先,我假设您已经阅读了这篇文章“多线程和实体框架” http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/e5cb847c-1d77-4cd0-abb7-b61890d99fae/在 MSDN 上。

从线程角度来看,解决方案#1 几乎肯定是最安全的,因为您可以保证在任何给定时间只有一个线程与上下文交互。保持上下文本身并没有什么问题——它并没有在幕后保持数据库连接打开,所以这只是内存开销。当然,如果您最终在该线程上遇到瓶颈并且整个应用程序是使用单数据库线程假设编写的,这可能会带来性能问题。

解决方案#2 对我来说似乎行不通——最终会在整个应用程序中出现微妙的错误,人们会忘记重新附加(或分离)实体。

一种解决方案是不在应用程序的 UI 层中使用实体对象。无论如何,我会推荐这个 - 很可能,实体对象的结构/布局对于您想要在用户界面上显示内容的方式来说并不是最佳的(这就是系列的原因)MVC http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller模式)。您的 DAL 应该具有特定于业务逻辑的方法(UpdateCustomer例如),并且它应该在内部决定是创建一个新的上下文还是使用存储的上下文。您可以从单一存储上下文方法开始,然后如果遇到瓶颈问题,您需要进行更改的范围有限。

缺点是您需要编写更多代码 - 您将拥有 EF 实体,但您还会拥有具有重复属性的业务实体,并且许多 EF 实体的基数可能不同。为了缓解这种情况,您可以使用类似的框架自动映射器 http://automapper.codeplex.com/简化将属性从 EF 实体复制到业务实体并再次复制回来的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架和多线程 的相关文章

  • & 在 xml 文件中算作一个还是多个字符?

    我正在使用的 XML 模式具有特定的字符串字符长度 所以我可能有一个类似的字符串 Jim Mary 在 C 中是 10 个字符 但是当它写入 xml 时 它会变成 Jim amp Mary 如果 XML 模式规定字符串最多只能有 10 个字
  • 如何将字符串解析为 UNIQUEIDENTIFIER?

    我正在编写一个实体框架 LINQ 查询 其中我想将字符串解析为 UNIQUEIDENTIFIER 又名 GUID 作为WHERE clause public IEnumerable
  • 单线程程序中可以有竞争条件吗?

    您可以在here https en wikipedia org wiki Race condition Software关于什么是竞争条件的一个很好的解释 我最近看到很多人对竞争条件和线程做出了令人困惑的陈述 我了解到竞争条件只能发生在线程
  • 从嵌入 C# 的浏览器控件获取 HTML 源代码

    我有一个嵌入在 C Windows 应用程序中的浏览器控件 我想获取渲染的 HTML 可能已被 javascript 修改 而不是原始 HTML 有什么建议么 您可以获取 HTML 并确实设置它 使用WebBrowser DocumentT
  • FileInfo.BaseName 存在于 PowerShell 中,但不存在于直接 .NET 中

    为什么在 NET 中System IO FileInfo对象没有BaseName属性 但我可以通过 PowerShell 使用该属性 例如 FolderItems Get ChildItem Path C Where Object isno
  • 对 URL 进行编码 C#

    所以我有一个看起来像这样的 URL http www test com folder1 id 3 但基本上 当他们单击按钮时 我想在 URL 栏中显示与该 id 关联的值的名称 例如 id 3 是名为 Rollex 的手表 所以我想要读取
  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • 如何通过start-stop-daemon正常关闭Spring Boot应用程序[重复]

    这个问题在这里已经有答案了 我们有一个多线程 Spring Boot 应用程序 它作为守护进程在 Linux 机器上运行 当我尝试像这样通过启动停止守护进程停止应用程序时 start stop daemon stop quiet retry
  • C# 无法访问已释放的对象

    我正在制作一个服务器 客户端应用程序 我将服务器套接字设置为侦听 并设置 BeginAccept 方法 当我关闭服务器套接字 Socket Close 以关闭服务器时 BeginAccept 方法的异步回调方法抛出异常 我检查了异常 发现异
  • 为什么 Application.Exit 无法工作?

    我有一个应用程序在取消对话框时出现奇怪的错误 如果该框被取消 应用程序将无法继续 因此它会退出 但由于某种原因它无法工作 因此它会继续运行并崩溃 我调试了这个问题 并且不知何故应用程序在 Application Exit 调用之后运行 我正
  • 如何防止控件在 TableLayoutPanel 内调整大小时视觉上滞后?

    我有一个基于多个嵌套的中等复杂度的布局TableLayoutPanels 调整窗体大小会导致更深嵌套表内的控件在视觉上滞后于调整大小 首先 这使得它们看起来像是在调整表单大小时四处移动 但更糟糕的是 当它们滞后到足以离开分配的表格单元格时
  • .NET Core == .NET Framework 5 吗?

    我一直在寻找书籍来研究最新的 NET Framework 据我所知 NET 最高为 4 6 但 ASP NET 最高为 5 核心 NET Core 是 NET 5 的名称还是我们目前仍使用 NET 4 6 去引用斯科特 汉塞尔曼 http
  • .NET 远程处理回调

    是否可以通过远程处理传输回调 我想做一些类似的事情myRemoteObject PerformStuff x gt Console WriteLine x 如果没有 我将如何实现等效的功能 Edit 我知道 Remoting 已被 WCF
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6

随机推荐

  • Java 将 JLabel 对齐在 JPanel 的中心

    我的应用程序顶部有一个栏 JLabel 两侧都有许多按钮 按钮的可见性取决于用户正在执行的当前任务 并且按钮的文本之一也可能根据当前状态而改变 我想做的是将许多按钮粘在 JPanel 的左侧 JLabel 的中心位于 JPanel 的正中心
  • NodeJS 的 Selenium Webdriver 的文档在哪里?

    我似乎没有找到任何一个 我总是找到的唯一一个是这个 https code google com p selenium wiki WebDriverJs https code google com p selenium wiki WebDri
  • 如何从一个模块向另一个模块发送消息?

    Angular有模块间通信的集成解决方案吗 如何将数据从一个模块发送到另一个模块 也许有一些事件循环 我将有一个您的两个通信模块所依赖的通用模块 公共模块将通过公开一个中介者模式来提供中介者模式的实现 service https docs
  • 我可以通过PHP语言控制硬件吗?

    我想知道是否可以使用PHP来控制与并行端口或USB端口连接的外部硬件 有什么想法或资源吗 对于 Linux 上的串行连接设备来说 这是一个有用的类 PHP串口 http www phpclasses org browse package 3
  • laravel uuid 未在查询中显示

    我有一个 postgres 数据库表 它使用 uuid 作为主键 通过webpatser laravel uuid包 以及 可读 的网络 ID 通过温克拉 哈希德 当我查询数据库时 如果我dd 响应中 我看到了完整的 UUID 但如果我只是
  • LiveCharts WPF 实时数据缓慢。提高 LiveCharts 实时绘图性能

    我正在研究在 WPF 应用程序中使用 LiveChart 来实时绘制温度测量结果 我整理了一个简单的折线图示例 以 10Hz 读取数据 并为每个样本重新绘制 然而 我发现重绘率约为 1Hz 对于 WPF 实时图表工具来说 这似乎非常慢 我的
  • 对 RichTextBox 字符串的不同部分着色

    我正在尝试对要附加到 RichTextBox 的字符串部分进行着色 我有一个由不同字符串构建的字符串 string temp DateTime Now ToShortTimeString userid message Environment
  • bootstrap datepicker、beforeShowDay 和禁用日期数组

    我正在尝试使用引导日期选择器插件 https github com eternicode bootstrap datepicker blob release docs index rst https github com eternicod
  • Xamarin:如何获取光标/触摸坐标(位置X和Y)?

    介绍 我正在创建我的第一个 Xamarin 应用程序 首先针对 UWP 然后是 Android 最后可能是 iOS 基本上 应用程序应该检测多个手指 并且圆圈会在每个手指上弹出并跟随它们 My app 首先 我认为 UI 和图形无法使用 X
  • 从 Heroku 上运行的 Celery 任务连接时出现 MySQL 查询错误

    在对外部 MySQL 数据库执行查询时 但仅在从 Heroku 上运行的 Celery 任务连接时 我看到错误的查询结果 同样的任务 在我自己的机器上运行时不会显示这些错误 并且错误只出现大约一半的时间 尽管当它们失败时 all任务是错误的
  • 欧拉计划:#8 [重复]

    这个问题在这里已经有答案了 当试图回答这个问题时 1000位数字中相邻的四个数字 最大乘积为 9 9 8 9 5832 73167176531330624919225119674426574742355349194934 969835203
  • 如何在 Doctrine 查询生成器中进行多个 WHERE IN 列查询?

    我想使用带有两列检查的 WHERE IN 语句更新数据库中的多条记录 纯 MySql 原始查询看起来像这样 并且它有效 UPDATE poll quota q SET q count q count 1 WHERE q form id 14
  • 使用 PHP 缩进 HTML(5) 时出现问题

    免责声明 请坦白这个问题的长度 这是我见过的现实世界问题中反复出现的问题 数百次都没有明确的 可行的解决方案 呈现 我有数百个 HTML 文件 我想使用 PHP 进行批量缩进 起初我想到使用 Tidy 但你应该知道 它默认与 HTML5 标
  • xCode 7:链接器命令失败,退出代码为 1(使用 -v 查看调用)

    当我在模拟器中运行我的应用程序时 一切正常 但是当我尝试在我的设备 iOS 8 4 上运行它时 我收到此错误 ld warning directory not found for option F Applications Xcode be
  • R闪亮:将文本显示为多行代码

    我想在我闪亮的应用程序上显示一些 R 代码 因此 我用了verbatimTextOutput但我找不到换行和显示代码段落的方法 这个解决方案 在 R Shiny 中使用 renderText 输出多行文本 https stackoverfl
  • Java中有通配符这样的东西吗?

    我正在运行一个比较程序 此时它会进行直接的 字符串到字符串 比较 如果它们完全匹配 则输出它们是匹配的 好吧 我希望添加一个允许 相似性 的附加功能 例如 String em1 52494646 String em2 52400646 if
  • 从 Azure SQL DW 中更新?

    我在尝试执行 UPDATE FROM 查询时在 Azure SQL DW 中收到错误 错误是 UPDATE 和 DELETE 语句中的 FROM 子句不能包含子查询源或联接 这只是 SQL DW 特有的吗 除此之外 我认为这个查询没有任何问
  • 局部变量类型推断未被识别

    我安装了 JDK 10 来尝试新功能 但我对此非常着迷var 由于某种原因 即使IntelliJ 版本2018 1 中添加了JDK 以下代码仍然无法编译 说Java找不到符号var public class Variations publi
  • 尝试返回列表中的数字

    我对这里的代码有几个疑问 我想做的是编写一个函数 它接受 2 个输入 一个列表和一个选项 其中选项为 0 或 1 并返回列表中的数字列表 如果选项为 0 它将返回大于 5 或 小于 5 的数字 如果选项为 1 它将返回第一个列表中所有奇数的
  • 实体框架和多线程

    我们在设计多线程实体框架驱动的应用程序时遇到一些问题 需要一些指导 我们在不同的线程上创建实体 将实体添加到集合中 然后将集合数据绑定到各种 WPF 控件 ObjectContext 类不是线程安全的 因此管理它我们基本上有 2 个解决方案