我们正在开发一个可以管理多个客户端的 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/