3

我正在使用带有实体框架的 BindingSource,当我调用

EntityContext.SaveChange();

下次我将新对象添加到绑定源然后调用 SaveChanges() 时,执行需要更多时间;方法

编辑 2

细节:

在加载表单事件

BindingSource.DataSource = EntityContext.Table;

添加新按钮

BindingSource.AddNew();
Table m_object= (Table)BindingSource.Current;
m_object.ID = Guid.NewGuid();

正在使用绑定到其属性的控件编辑其他对象数据

然后是保存按钮

BindingSource.EndEdit();
Stopwatch sw = new Stopwatch();
sw.Start();
EntityContext.SaveChanges();
sw.Stop();
Console.WriteLine(sw.Elapsed.ToString());

如果我重复添加和保存几次,我会得到以下输出:

00:00:01.0788243

00:00:00.0316786

00:00:00.0292763

00:00:00.0298630

00:00:00.1127312

值得注意的是,第一次添加和保存操作比下一次添加和保存要多花将近一秒钟。

4

3 回答 3

1

这可能有很多原因,一个可能的原因是您的数据库在您执行第一次提交时是自动增长的。您是否有正在执行的代码示例以及您观察到的时间差异

编辑:

根据您上面的代码,如果数据库中不存在一个新项目,您是否正在创建一个新项目,是否是第二次单击保存时您只是在执行 SQL 中更快的更新操作?(如果 EF 检测到没有变化,则可能为 0 次)

于 2012-04-18T00:17:51.407 回答
0

另外,不要忘记 EF Change Tracker,它可能在第一次操作后缓存数据。根据 MergeOption 和您正在执行的操作,EF 可能会选择不调用数据库。我将使用 SQL Profiler 运行测试,以查看对数据库的实际调用的差异。此外,检查后续调用是否使用相同的数据库连接。

于 2012-04-18T17:21:37.767 回答
0

Luke 提供的原因,但也不要忘记 JIT(即时)编译。当您运行 C# 应用程序时,它全部编译为 MSIL(Microsoft 中间语言),当您第一次开始调用方法时,JIT 必须将它们编译为本机代码并运行优化以适应其运行的操作系统。这是您第一次执行大量操作时可能会延迟几秒而不是预期毫秒的常见原因。

Mono 具有 AOT (ahead-of-time) 编译功能,这意味着它会跳过该步骤并避免第一次调用方法时的额外时间,但会牺牲其他地方的性能。

还有一个工具可以让你在 Windows 上本地预编译 C#,但我不记得它叫什么了。

http://en.wikipedia.org/wiki/Just-in-time_compilation

于 2012-04-18T00:48:45.257 回答