- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为 Entity Framework 的新手,我真的很困惑如何继续处理这组问题。在我目前正在进行的项目中,整个站点都与 EF 模型高度集成。最初,对 EF 上下文的访问是使用依赖注入(inject) Bootstrap 进行控制的。由于操作原因,我们无法使用 DI 库。我删除了它并在需要时使用了上下文对象的各个实例的模型。我开始遇到以下异常:
The type 'XXX' has been mapped more than once.
我们得出的结论是,上下文的不同实例导致了此问题。然后,我将上下文对象抽象为每个线程/页面访问的单个静态实例。我现在遇到有关交易的几个异常之一:
New transaction is not allowed because there are other threads running in the session.
The transaction operation cannot be performed because there are pending requests working on this transaction.
ExecuteReader requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.
最后一个异常发生在加载操作上。我并没有尝试将上下文状态保存回失败线程上的数据库。然而,还有另一个线程执行此类操作。
这些异常充其量只是间歇性的,但我已经设法使站点进入由于事务锁定而拒绝新连接的状态。不幸的是我找不到异常详细信息。
我想我的第一个问题是,是否应该从静态单实例中使用 EF 模型?另外,是否可以消除 EF 中事务的需要?我尝试使用 TransactionScope
对象但没有成功...
说实话,我被困在这里,无法理解为什么(应该是)相当简单的操作会导致这样的问题......
最佳答案
在 Web 应用程序中创建一个全局 Entity Framework DbContext
是非常糟糕的。 DbContext
类不是线程安全的( Entity Framework v1 的 ObjectContext
类也是如此)。它是围绕 unit of work 的概念构建的。这意味着您使用它来操作单个用例:因此用于业务交易。它旨在处理一个请求。
您遇到的异常是因为您为每个请求创建一个新事务,但尝试使用相同的DbContext
。您很幸运,DbContext
检测到了这一点并抛出异常,因为现在您发现这不起作用。
DbContext
包含数据库中实体的本地缓存。它允许您进行大量更改并最终将这些更改提交到数据库。当使用单个静态 DbContext
时,多个用户在该对象上调用 SaveChanges
,它应该如何知道哪些内容应该提交,哪些内容不应该提交?
因为它不知道,所以它会保存所有更改,但此时另一个请求可能仍在进行更改。如果幸运的话,EF 或您的数据库将会失败,因为实体处于无效状态。如果您运气不好,处于无效状态的实体会成功保存到数据库中,并且您可能会在几周后发现您的数据已损坏。
解决您的问题的方法是创建 at least one DbContext
per request 。虽然理论上您可以在用户 session 中缓存对象上下文,但这也是一个坏主意,因为在这种情况下,DbContext
通常会存在太长的时间并且会包含过时的数据(因为它的内部缓存将不会自动刷新)。
另请注意,每个线程拥有一个 DbContext
与整个 Web 应用程序拥有一个实例一样糟糕。 ASP.NET 使用线程池,这意味着在 Web 应用程序的生命周期中将创建有限数量的线程。这基本上意味着在这种情况下,这些 DbContext 实例在应用程序的生命周期内仍然存在,从而导致与数据过时相同的问题。
您可能认为在单个 .NET(托管)线程的线程情况下存储 DbContext
是线程安全的,但通常情况并非如此,因为 ASP.NET一种异步模型,允许在与启动线程不同的线程上完成请求(最新版本的 MVC 和 Web API 甚至允许任意数量的线程按顺序处理一个请求)。这意味着启动请求并创建 DbContext 的线程可以在初始请求完成之前很久就可以处理另一个请求。然而,该请求中使用的对象(例如网页、 Controller 或任何业务类)可能仍然引用该DbContext
。由于新的 Web 请求在同一线程中运行,因此它将获得与旧请求所使用的相同的 DbContext
实例。这会再次导致应用程序中出现竞争条件,并导致与一个全局 DbContext
实例导致的线程安全问题相同的问题。
关于.NET Entity Framework 和事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266295/
我有这些实体(这只是我为这篇文章创建的抽象): 语言 区 说明 这些是它们之间的引用: 区 * - 1 语言 说明 * - 1 语言 区 1 - 1 说明 如果我这样取: var myFetch =
经过大量谷歌搜索后,除了降级 hibernate 版本之外,我没有找到问题的答案。但我在 2003 年类似的帖子中遇到了这种情况。 问题是什么: //in the first session I d
我听说过 linq to entities 。 Entity Framework 是利用linq to entities吗? 最佳答案 LINQ to Entities 是 Entity Framew
我是 Entity Framework 和 ASP.Net MVC 的新手,主要从教程中学习,对任何一个都没有深入了解。 (我确实有 .Net 2.0、ADO.Net 和 WebForms 方面的经验
如果我编写 LINQ to Entities 查询,该查询是否会转换为提供程序理解的 native 查询(即 SqlClient)? 或者 它是否会转换为实体 SQL,然后 Entity Framew
这个问题已经有答案了: EF: Include with where clause [duplicate] (5 个回答) 已关闭 2 年前。 看来我无法从数据库中获取父级及其子级的子集。 例如...
我开始在一家新公司工作,我必须在一个旧项目上使用 C++ 工作。所以,我忘记了一些 C++ 本身的代码结构。在一个函数中,我在一个函数中有双冒号::,但我不知道如何理解它。 例如,我知道如果我有 EN
我写了一个方法来允许为 orderby 子句传递一个表达式,但我遇到了这个问题。 Unable to cast the type 'System.DateTime' to type 'System.I
简单的问题:LINQ to Entities 和 Entity Framework 有什么区别?到目前为止,我认为这两个名称是用来描述同一个查询的,但我开始觉得事实并非如此。 最佳答案 Entity
我想使用 Entity Framework 。但是,我还要求允许我的用户在我们的系统中定义自定义字段。我想仍然使用 Entity Framework ,而不是使用具有哈希表属性的分部类。 下面是我想到
我正在阅读这个 E.F. 团队博客的这个系列 http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-featu
我正在使用 EF6 开发插件应用程序,代码优先。 我有一个名为 User 的实体的主要上下文。 : public class MainDataContext : DbContext { pub
当我得到最后的 .edmx 时,我遇到了问题。 我收到一条消息说 错误 11007:未映射实体类型“pl_Micro”。 查看设计器 View ,我确实看到该表确实存在。 我怎样才能克服这个消息? 最
我已阅读与使用 Entity Framework 时在 Linq to Entities (.NET 3.5) 中实现等效的 LEFT OUTER JOIN 相关的所有帖子,但尚未找到解决以下问题的方
使用 WCF RIA 服务和 Entity Framework 4. 我有 3 个 DTO:学校、州、区。 州 DTO 有一个地区属性(property),其构成。学校 DTO 有一个国家属性(pro
我有一个 Employee 实体,它继承自一个继承自 Resource 实体(Employee -> Person -> Resource)的 Person 实体。是否可以通过编程方式获取 Emplo
我有一个使用 JPA 的 java 应用程序。 假设我有一个名为 Product 的实体与 name和 price属性(所有实体都有一个 id 属性)。 自然我可以得到一个List相当容易(来自查询或
我有一个 Entity Framework 类,其中有两个指向另一个对象的引用 public class Review { [Key] public int Id {get;s
我是 Symfony 2 的新手,我想知道一些事情: 假设我的项目中有 2 个 bundle 。我想在两个包中使用从我的数据库生成的实体。 我应该在哪里生成实体? (对我来说,最好的方法是在 bund
我想在具有方法和属性的部分类中扩展 EF 实体。我经常这样做。 但是现在我需要将来自该实体的数据与来自其他实体的数据结合起来。因此,我需要能够访问实体 objectcontext(如果附加)来进行这些
我是一名优秀的程序员,十分优秀!