实体框架代码优先非常慢

2023-11-30

从广泛的谷歌搜索来看,我似乎不是第一个遇到这个问题的人,但我一直找不到能够令人满意地解决它的人 - 我正在与遗留数据库集成,我只是试图与单个表集成(目前),但我对该模型的第一次查询需要大约 12 秒左右的时间来执行。正如预期的那样,第二个电话几乎是即时的。

以下是我的 Entity Framework Code First 设置的全部内容:

public class PortalDatabase : DbContext
{
    public DbSet<User> Users { get; set; }

    public PortalDatabase():base("portalDatabase")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        User.ConfigureEntity(modelBuilder.Entity<User>());
    }
}

public class User
{
    public int ID { get; set; }

    public string FullName { get; set; }

    /// <summary>
    /// Internal representation of the IsDisabled flag. This should not be
    /// written to; use <see cref="IsDisabled"/> instead.
    /// </summary>
    internal byte IsDisabledInternal { get; set; }

    public bool IsDisabled
    {
        get { return Convert.ToBoolean(this.IsDisabledInternal); }
        set { this.IsDisabledInternal = Convert.ToByte(value); }
    }

    public int LoginAttempts { get; set; }

    public string EmailAddress { get; set; }

    public string Password { get; set; }

    internal static void ConfigureEntity(EntityTypeConfiguration<User> entity)
    {
        entity.ToTable("Users");

        entity.Property(model => model.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .HasColumnName("UserID");

        entity.Property(model => model.FullName)
            .HasColumnName("UserName");

        entity.Property(model => model.IsDisabledInternal)
            .HasColumnName("AccountLocked");

        entity.Ignore(model => model.IsDisabled);

        entity.Property(model => model.LoginAttempts)
            .HasColumnName("LoginAttempts");

        entity.Property(model => model.EmailAddress)
            .HasColumnName("EmailAddress");

        entity.Property(model => model.Password)
            .HasColumnName("Password");
    }
}

此代码示例需要 8-12 秒才能执行:

    PortalDatabase database = new PortalDatabase();

    IEnumerable<User> users = from user in database.Users
                              where user.ID == 66
                              select user;

据我所知,这个问题与元数据生成有关,元数据生成仅执行一次,这根据 ScottGu 的评论“大大提高性能”:

“代码优先”库使用与传统方法相同的底层 EF - 因此性能特征应该大致相同。 “代码优先”库还包括 aome smarts,以便缓存为映射到数据库或从数据库检索的元数据 - 这样它只需要计算一次(这大大提高了性能)。

但我所描述的表现是平均水平吗?我无法想象实体框架团队会接受花 12 秒执行一个简单查询。我是不是误会他了?元数据缓存是否在 IIS 应用程序池等的生命周期内持续存在?这在某种程度上可能是可以接受的,尽管仍然不太理想。

如果我不先使用代码,那么我就能够使用 EdmGen.exe 生成我的视图,据我了解,这将使我的应用程序变得更快。首先使用代码开发模型时是否有等效的方法?

2012 年 2 月 14 日更新: 谢谢帕维尔的帖子,我能够产生我的观点。不幸的是,这并没有改变创建新 PortalDatabase 实例的速度,仍然需要相同的时间。我知道正在使用视图,因为我在构造函数中放置了断点,但这不会影响任何内容。


要使用 CodeFirst 生成视图,请使用 EF Power Tools。请在此处查看更多详细信息:http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx

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

实体框架代码优先非常慢 的相关文章

  • 为什么实体框架需要 ICollection 来延迟加载?

    我想编写一个丰富的域类 例如 public class Product public IEnumerable
  • SQL 性能除外

    我尝试使用类似于以下查询的查询来查找两个表之间的差异 DEV 数据库与 TEST 数据库中的同一个表 每个表有约 30K 行和约 5 列 select field1 field2 field3 field4 field5 from dev
  • 带有输出文件和屏幕输出的 sqlcmd

    我使用 sqlcmd 执行一些命令行批处理 bat 如下所示 sqlcmd i Scripts STEP01 sql o PROCESS log S MYSERVER E d MYDATABASE 我需要一个输出文件 当前有效 以及通过屏幕
  • 实体框架 - Linq NOT IN 查询

    我见过其他几个帖子提出类似的问题 但坦率地说我很困惑 我正在尝试在 EntityFarmework 和 Linq 中执行以下 sql 语句 但无法让 NOT IN 和 UNION 工作 SELECT LmsTeam FROM LmsTeam
  • 为什么在 SQL Server 中从 float 到 varchar 的转换要四舍五入?

    以下 SQL declare a as float b as float select a 1 353954 b 1 353956 select CAST a as VARCHAR 40 AS a float to varchar CAST
  • ADO.NET 实体框架的实际好处是什么?

    我正在读这篇关于ADO NET 实体框架 http msdn microsoft com en us library bb399572 aspx并发现它非常有趣 尽管在第一个镜头中我无法破译很多东西 我再次阅读这篇文章 以了解其背后的真正逻
  • 在实体框架中定义两个外键作为主键

    在实体框架中 我想使用两个外键作为另一种实体类型的主键 public class CustomerExtensionValue Values for extended attributes of a customer Key Column
  • 使用 SESSION_CONTEXT 的实体框架核心行级安全性

    我正在使用 ASP NET Core 和 Entity Framework 7 Core 编写一个使用行级安全性的多租户应用程序 由于我的数据库托管在 Microsoft SQL Server 上 因此我使用了this https msdn
  • 基于现有数据库表创建@TableVariable?

    我想在存储过程中使用表变量 但这是一个问题 我的表非常大 声明表变量也需要很长的代码来编写和调试 请告诉我一些快速声明表变量的方法 是否可以基于现有表创建表变量 或者请分享任何创建用于创建表变量的代码的提示 Thanks 右键单击表格 选择
  • 将密码存储到sql中的最佳方法

    在我当前的 C Windows 应用程序中 密码已以纯文本形式存储 这显然不好 所以我只想知道加密密码并存储到 SQL Server 中的最佳方法是什么 我读到使用哈希 盐更好 但我觉得sql 2005中的 EncryptByPassPhr
  • 实体框架 4.1:重写 IEnumerable 验证

    public abstract class Animal IValidatableObject public string Id get set public string Name get set public virtual IEnum
  • 使用 Moq 模拟实体框架 6 ObjectResult

    如何使用 Moq 模拟 Entity Framework 6 ObjectResult 以便对依赖 EF 数据库连接的代码进行单元测试 沿着这些思路阅读了大量的问题和答案 并从我所读到的内容中收集了许多有价值的信息 我已经实现了我认为相当优
  • 我的 POST 编辑操作是否会覆盖 EF 中的所有字段?

    假设我有一个包含 7 个字段的数据库记录 我只想编辑字段 1 的内容 所以我点击了 GET EDIT 操作 它使用我的视图模型呈现强类型视图 然后我继续更新字段 1 但是 我的POST 操作包含所有字段的 映射 如下所示 实体框架也是如此
  • EF 6 基于代码的迁移:向现有实体添加非空属性

    我想向现有表添加一个非空外键列 环境 EF 6 代码优先 基于代码的迁移 Code from Migration class for new entity Currency CreateTable dbo Currency c gt new
  • 此上下文中仅支持实体类型、枚举类型或基本类型

    我目前正在开发一个搜索页面 我只需要返回主题的主题详细信息列表 其中包含存储在 int ST 中的所有主题标签 id 目前 ST null true ST Contains b ThemeTagID 行似乎给了我一个错误 附加信息 无法创建
  • 将列添加到 ASP.NET Identity 中的 AspNetUserClaims

    我在用着Microsoft AspNet Identity Core 2 2 1在我的解决方案中 我需要将其与另一个应自动添加声明的系统集成 为了跟踪哪些声明是手动添加的以及哪些是由外部系统创建的 我希望在我的AspNetUserClaim
  • 带附件的数据库电子邮件(excel 文件/pdf 文件)?

    我必须从数据库向我的邮件 ID 发送一封带有附件的邮件 EXEC msdb dbo sp send dbmail profile name Adventure Works Administrator recipients email pro
  • 实体框架左外连接和分组抛出:ORA-00907:缺少右括号

    我在基于实体框架的数据访问中使用实体框架来定位多个数据库 我们是一个使用 Entity Framework 已有 2 年的团队 生成的代码与 sql server 2008 完美配合 现在 我们在将数据库迁移到 Oracle 11 Expr
  • SQL Server 2005 - 达到表行大小限制

    有没有一种干净的方法可以在向表添加新列之前确定表的行大小 并且不超过 8060 字节的限制 例如 如果表行长度当前为 8055 字节 并且我想添加日期时间 8 字节 则这将结束 因为它将变为 8063 字节 不包括空映射 但是 如果我添加一
  • 使用 UnitofWork 模式的 Rhino 模拟实体框架不起作用

    这是我第一次尝试这样的事情 所以希望这很简单 我创建了一个使用实体框架访问数据库的 WCF 服务 我已经实施了一个工作单元接口 以便我的服务可以使用 EF 同时仍然可测试 这是我的服务 public class ProjectService

随机推荐