c# - 指定主键等信息是否会影响 EntityFramework 性能?

标签 c# entity-framework

假设我有这个简单的实体:

public class Person
{
    public int    PersonID { get; set; }
    public string Name     { get; set; }
}

Entity Framework 可以根据约定推断PersonID 字段是主键。但是,如果我给模型构建器这个类:

public class PersonCfg : EntityTypeConfiguration<Person>
{
    public PersonCfg()
    {
        ToTable("Person", "Person");
        HasKey(p => p.PersonID);
    }
}

这会提高启动性能吗?我的想法是它可能会让 EF 减少反射并更快地启动应用程序,但我不知道它在幕后如何工作以了解它是否有任何影响。

最佳答案

要对此进行测试,您可以使用 DbModelBuilder 类自行构建模型并跟踪“编译”步骤的速度。

这是我的示例代码(LinqPad 脚本):

void Main()
{
    // Initialize the overall system, but don't count the result.
    BuildC();

    DateTime startDateA = DateTime.Now;
    BuildA();
    DateTime.Now.Subtract(startDateA).TotalMilliseconds.Dump("A");

    DateTime startDateB = DateTime.Now;
    BuildB();
    DateTime.Now.Subtract(startDateB).TotalMilliseconds.Dump("B");
}

public class PersonA
{
    public int PersonAId { get; set; }
    public string Name { get; set; }
}

private void BuildA()
{
    var builder = new DbModelBuilder();
    builder.Entity<PersonA>();
    var model = builder.Build(new DbProviderInfo("System.Data.SqlClient", "2008"));
    model.Compile();
}

public class PersonB
{
    public int PersonBId { get; set; }
    public string Name { get; set; }
}

private void BuildB()
{
    var builder = new DbModelBuilder();
    builder.Conventions.Remove<IdKeyDiscoveryConvention>();
    builder.Entity<PersonB>()
        .HasKey(p => p.PersonBId);
    var model = builder.Build(new DbProviderInfo("System.Data.SqlClient", "2008"));
    model.Compile();
}

public class PersonC
{
    public int PersonCId { get; set; }
    public string Name { get; set; }
}

private void BuildC()
{
    var builder = new DbModelBuilder();
    builder.Entity<PersonC>()
        .HasKey(p => p.PersonCId);
    var model = builder.Build(new DbProviderInfo("System.Data.SqlClient", "2008"));
    model.Compile();
}

我得到 2.0004 毫秒到 2.0009 毫秒的结果。奇怪的是,删除约定会使操作花费更长的时间。

关于c# - 指定主键等信息是否会影响 EntityFramework 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23869166/

相关文章:

c# - Entity Framework 6.0 错误与 Mysql 连接器 6.8.3.0

entity-framework - EF Core - 代码首次迁移 : Incorrect syntax near the keyword 'NOT'

c# - 从矩阵获取区域/区域边界

c# - Unity 的 Google Play 服务插件有一些错误

c# - 删除 Entity Framework 上下文中的所有记录并重新创建它的正确方法是什么?

c# - Entity Framework 6.0 原始 SQL 以查看模型

c# - 获取 "Show as"用于 EWS 中的约会

c# - c# 如何找出 "m"来自 (m => m.SomeProperty)?

C# EF ASP.NET Web API 超时 - 如何调用长时间运行的查询?

visual-studio - 托管调试助手 'FatalExecutionEngineError' 0xc0000005