sql-server - 为什么使用 Entity Framework 创建 MSSQL(Express) 数据库这么慢?

标签 sql-server database performance ef-code-first entity-framework-6

我们正在开发一个可以管理多个客户端的 WPF 应用程序。对于每个客户端,我们需要一个单独的数据库(在同一个 SQL Server 实例中)。所以我们不止一次需要“创建数据库”。所有单独的客户端数据库都将具有相同的数据库结构。

我们使用 Entity Framework 版本 6.1.3、代码优先和本地安装的 SQL Server 2014 Express。在我们的“真实”业务应用程序中,正确创建了一个包含大约 60 个表的新数据库,但性能不是很好。

为了找出问题所在,我编写了一个小示例程序,该程序循环创建 5 个数据库,每个数据库 1 个表。在我的 Dev-PC(Windows 10、i7-6700 3.40GHz、16 GB RAM)上,这 5 个数据库的执行时间约为 1 分钟(每个数据库 11-12 秒)。当我调试应用程序时,我看到线路上有一个漫长的等待

dbContext.Database.CreateIfNotExists();

在 SQL Server Profiler 中,我发现每个循环大约需要 10 秒才能到达第一个条目。

知道时间在哪里丢失了吗?或者关于在 Entity Framework 中使用相同的 DbContext 创建许多数据库(> 20)的其他建议?

这里是我的示例应用程序的源代码:

using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System;

namespace TestEnityFramework01.Model
{
    [Table("Table01")]
    public class Table01        {
        [Key]
        [Column("ID", Order = 0, TypeName = "int")]
        public int ID { get; set; }

        [Column("Number01", TypeName = "int")]
        public int Number01 { get; set; }

        [Column("Date01")]
        public DateTime? Date01 { get; set; }

        [StringLength(50)]
        [Column("Text01", TypeName = "nvarchar")]
        public string Text01 { get; set; }

        [Column("Amount01")]
        public decimal Amount01 { get; set; }

        [Column("Doule01")]
        public double Doule01 { get; set; }

        [Column("Bool01")]
        public bool Bool01 { get; set; }
    }
}

和上下文:

using TestEnityFramework01.Model;
using System.Data.Entity;

namespace TestEnityFramework01.Context 
{
    class ContextA : DbContext
    {
    public DbSet<Table01> Tabel01 { get; set; }

    public ContextA()
        : base("ContextA")
    {
        // Don't create database automatically
        Database.SetInitializer<ContextA>(null);
    }

    public ContextA(string pConnectionString)
            : base(pConnectionString)
        {
            // Don't create database automatically
            Database.SetInitializer<ContextA>(null);

            this.Configuration.AutoDetectChangesEnabled = false;
            this.Configuration.LazyLoadingEnabled = false;
            this.Configuration.ValidateOnSaveEnabled = false;
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
}

测试程序循环生成五个数据库:

private void button_Click(object sender, RoutedEventArgs e)
{
    int _randomNumber = 0;

    for (int i = 1; i <= 5; i++)
    {
        // create random number between 1 and 100'000
        _randomNumber = new Random().Next(1, 100000);

        // concat the random number to the database name
        string _databaseName = "DatabaseCustomer" + _randomNumber.ToString();

           // the connection-string look like this:
           // "Data Source=MyPC\SQLEXPRESS;Initial Catalog=MyDatabaseName;User ID=MyUser;Password=MyPassword;Integrated Security=False;MultipleActiveResultSets=True;"            
        string  _connectionString = GetConnectionString(_databaseName);

        using (var dbContext = new ContextA(_connectionString))
        {
            // create the database
            dbContext.Database.CreateIfNotExists();
        }
    }
}

**** 2016 年 6 月 16 日更新 **** 当我将数据库连接从 SQL-Server 2014 Express 切换到“SQL Server Compact Edition”时,所有 5 个数据库的创建时间约为 1 或 2 秒。可能是我使用了错误的连接字符串来连接 sql-server 或者我的 SQL-Server 2014 Express 配置不正确?

最佳答案

这是因为代码优先方法会创建一个新数据库并与其建立连接。

我认为您应该使用 sql 查询来创建数据库。

如果您愿意,我可以帮助您,您将如何设计更好的 UI 和功能

请回复我的回答。

关于sql-server - 为什么使用 Entity Framework 创建 MSSQL(Express) 数据库这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727510/

相关文章:

sql-server - sql server xml同时删除两个属性

sql-server - SQL Server 的 SET NOEXEC 或 NOPARSE 的 Oracle 等效项是什么?

asp.net - 总结历史正常运行时间数据

java - Derby 查询非常慢

python - 检查对象是否存在

php - 验证组中特定且唯一的一组值

performance - AVX中绝对值的浮点比较

sql-server - 结合两个日期列表,结合更多信息

performance - 以更干净/更有效的方式过滤数据

html - 动态内容的 css 文件中的数据 URI