- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个宠物项目(一个简单的论坛应用程序),我用它来测试所有最新的 .NET 技术,最近我开始玩弄 Entity Framework Code-First。这个应用程序已经有一个现有的 EF 解决方案,其中一个 EDMX 文件映射到一个现有的数据库,我的所有实体都是自动生成的。到目前为止,该解决方案效果很好。
注意:请记住,对 EF 4.1 的这一更改纯粹是为了学习。如果你想知道我的需求是什么导致我升级,没有任何需求。我只是想好玩。
我复制了该项目并进行了升级,因此我将拥有相同的项目但具有不同的 Entity Framework 实现。在新项目中,我使用了一个名为 Entity Framework Power Tools 的 Visual Studio 扩展来从我现有的数据库中生成 POCO 和 DbContext。一切都完美无缺。我在大约 30 分钟的时间内编译了该应用程序。相当令人印象深刻。
但是,我现在在运行该应用程序时注意到,查询执行速度比以前慢了大约 3 倍。知道我可能错过了什么吗?
下面是两种解决方案的详细信息,以及两种解决方案的 LINQPad 测量结果。 (点击图片查看全尺寸)
这是我的 EF 4.0 数据模型的快照。它切断了顶部和底部的一些实体,但你明白了。
http://www.codetunnel.com/content/images/EF41question/1.jpg这是针对我的 EF 4.0 数据模型的 LINQPad 测试。
http://www.codetunnel.com/content/images/EF41question/2.jpg请注意,执行该查询需要 2.743 秒。
这是我的 EF 4.1 数据模型的快照。由于它是纯代码,因此我将展示 DbContext 类以及一个实体和一个实体本身的映射类之一(流畅的 API 代码)。
数据库环境 http://www.codetunnel.com/content/images/EF41question/3.jpgTopicMap(流畅的API配置) http://www.codetunnel.com/content/images/EF41question/4.jpg主题(POCO 实体) http://www.codetunnel.com/content/images/EF41question/5.jpg这是针对我的 EF 4.1 模型的 LINQPad 测试。
http://www.codetunnel.com/content/images/EF41question/6.jpg请注意,这次查询花费了 6.287 秒来执行,而且是完全相同的查询。第一次运行需要 30 多秒。如果我转到 LINQPad 中的 SQL 和 IL 选项卡,生成的 SQL 和 IL 代码对于两个数据模型都是相同的。这真的让我很伤心。在实际应用程序中,EF 4.1 的速度太慢以至于无法使用。
我对这两个模型运行了相同的 LINQ 查询。该查询获取普通论坛用户的所有主题,按最后回复日期(如果没有回复,则按主题发布日期)降序排列。
显然,我可以回到 EF 4.0 并继续我的快乐之路,但我真的很想知道我是否遗漏了什么。
最佳答案
由于最近的一些发展,我正在重新审视这个答案。
由于 Microsoft Entity Framework 团队的一些询问试图重复我的问题,我返回并回顾我的步骤以更好地帮助缩小问题范围。我问这个问题已经有一段时间了,我现在比那时更了解事情了。
我没有回头尝试运行一些非常旧的代码,而是决定从头开始做一个简单的测试项目。我将一个简单的数据库与两个表放在一起,并将它们映射到一个 EF 4.0 设计器文件。
这生成了一个像这样的连接字符串:
<add name="EFTestEntities" connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string="data source=.\sqlexpress;initial catalog=EFTest;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
然后我用 1000 行测试主题和每个主题的 10 行回复填充了数据库。完成这项工作后,我对一个非常基本的查询进行了计时,该查询与我的主要问题中的查询非常相似。然后我复制了测试项目并使用 Entity Framework Power Tools 修改了它扩展来生成我的模型对象和 DbContext。我唯一修改的是连接字符串,用于删除项目中有设计器文件时引用的元数据,因此它看起来像这样:
<add name="EFTestContext" providerName="System.Data.SqlClient" connectionString="Data Source=.\sqlexpress;Initial Catalog=EFTest;Integrated Security=True;Pooling=False" />
然后我运行了与设计器完全相同的查询。
除了代码优先生成映射元数据所需的时间稍微多一些外,查询时间没有差异。在初始查询之后,两个版本的 EF 的性能几乎相同。我正要解决这个不可重现的问题,但后来我注意到我在这个问题上做了一些可怕的事情。我在查询之前调用了 .AsEnumerable()
。如果您还不知道它的作用,这将导致整个实体集合被拉入内存,然后查询将作为 LINQ-to-Objects 而不是 LINQ-to-Entities 在那里应用。
这意味着我将整个表吸入内存,然后在那里对其执行 LINQ。如果 SQL Server 与您的网站位于同一台机器上,您可能不会注意到其中的差异,但在很多情况下这将是一个大问题。在我的例子中,它确实导致了性能损失。
我回到我的测试,并在查询之前使用 .AsEnumerable()
运行它们。
现在我预计时间会变慢,因为我的 LINQ 查询没有被翻译成表达式树并在数据库中执行。但是,似乎我确实在我的问题中重现了这个问题。仅代码版本的返回速度要慢得多。这实际上很奇怪,因为它们应该运行相同。我对它们运行速度比针对 IQueryable 的查询慢并不感到惊讶,但现在它们针对 IEnumerable 运行时,两者之间存在很大差异。通过向表中添加越来越多的数据,我能够扩大两者之间的差异。
我继续向数据库添加了 5000 个主题,每个主题有 30 个回复。所以现在总共有 6000 个主题行和 165000 个回复行。首先,我使用适当的 LINQ-to-Entities 运行查询:
如您所见,仍然没有区别。然后我使用 .AsEnumerable()
针对 LINQ-to-Objects 运行查询。
我在三个查询后停止了它,因为每个查询等待大约两分钟是非常痛苦的。我似乎无法产生我在问题中显示的 3x 慢问题,但仅代码速度要慢得多。 EDMX 方法只需不到两分钟即可完成一个查询,而纯代码方法始终需要两分钟以上。
关于c# - 在我的应用程序中,EF 4.1 代码优先执行查询比常规 EF 慢 3 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604571/
EF POCO 和 EF Code First 有什么区别? 如果我一开始只使用 POCO,我可以将 EF 与它们一起使用吗? 最佳答案 如果您首先使用 EF 代码,您将拥有 POCO 对象,并且数据
EF POCO 和 EF Code First 有什么区别? 如果我一开始只使用 POCO,我可以将 EF 与它们一起使用吗? 最佳答案 如果您首先使用 EF 代码,您将拥有 POCO 对象,并且数据
我有一个基于 .NET 4.8 和 EF 6.4.4 的项目。我们正在逐步迁移到 .Net Core,但在此过程中我可以创建一个 .NET Core 数据上下文类 EF Core 并将两者指向相同的实
我有以下 Entity Framework 5 代码第一类 public class Airplane { public int Id { get; set; } public int
我正在尝试使用 Entity Framework Core 对现有数据库进行逆向工程.我试着按照指示from Microsoft但我遇到了错误: Unable to find provider ass
当数据库不是由 EF 代码首先创建时,有没有办法检查 DbContext 是否与数据库匹配? 我正在寻找与 Database.CompatibleWithModel 类似的功能但没有元数据。 最佳答案
目前,我正在重构我的上下文方法的测试,以不再需要真正的数据库。我使用 Ef Core。 所以我通读了 Microsoft 文档如何测试上下文方法。我首先找到了 EF6 测试的文档,然后阅读了 EfCo
我正在使用 EF 6 Database.SqlQuery 语句来执行存储过程,并实现错误和事务处理,打开和关闭事务(处理多个记录,如果一个记录有错误,仅回滚此,并提交其他任何内容无错误完成)。 Lis
我首先使用 EF 数据库,因为我喜欢在 SQL Management Studio 中设计我的数据库,坦率地说,让 Visual Studio 直接从数据库创建所有实体非常容易,而无需执行任何代码。
我的项目中有几个迁移文件,由于我对上次迁移进行了手动修改,所以我不想使用“程序包管理器控制台”重新生成它。我只需要添加 1 列。所以在之前的迁移中手动添加了这个(我可以这样做,因为还没有人升级过)。
原文:https://bit.ly/2umidlb 作者:jon p smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的。其中可能会去除一些本人实在不知道如何组
我们想开始一个新项目,我们决定从一开始就在一些表中使用 Columnstore 索引和聚簇索引,我们如何使用 Code First EF Core 3.1 做到这一点? 最佳答案 您应该将主键更改为非
我在 Entity Framework 6.0 上。这是一个开发问题,而不是生产问题。 我想我有一个相互矛盾的策略。 目前,我设置了 DropCreateDatabaseIfModelChanges
我在 VS 2012 RTM 上,使用 EF 5。我在做代码优先,但由于我只是在开发中,所以试图忽略代码迁移。为了避免它们,我有这一套 Database.SetInitializer(new Drop
我有复杂的审计字段类型 我的复杂类型: [ComplexType] public class AuditData { [Column("CreatorUserId")] public
我已经阅读了很多关于如何在关系中指定外键名称的帖子,没有遇到任何问题。不过,我想知道的是,有没有办法更改主键和关系的命名方式? 例如,您有一个以 UserId 作为主键的 User 表。 EF 代码第
我刚刚安装了新的Entity Framework 4.1 NuGet包,因此根据NuGet指令和this article of Scott Hanselman替换了EFCodeFirst包。 现在,想
我的应用程序基于 .NET 4.0 和 EF 4。我现在正在考虑升级到最新版本。 是否有任何可能对我的申请产生不利影响的重大变化或行为差异? 升级路径有多简单?升级到 EF 5 是否需要任何代码更改或
假设您必须使用 EF Code First 和 POCO 类开发支持多种语言的网站,您将如何对 POCO 类进行建模以支持这种情况? 通过多语言支持,我的意思不仅是拥有例如在一些资源文件中为您的 UI
我首先使用 EF 4.1 代码。鉴于以下类片段: public class Doctor { public virtual ICollection Hospitals { get; set;
我是一名优秀的程序员,十分优秀!