2011-04-28 73 views
2

其中有更好的表现:实体框架事务:什么更好的性能?

using (GADEEntities context = new GADEEntities(_connectionString)) 
{ 
    using (TransactionScope transaction = new TransactionScope()) 
    { 
     AddToContext1(context); 
     AddToContext2(context); 
     AddToContext3(context); 
     ... 

     context.SaveChanges(); 

     transaction.Complete(); 
    } 
} 

using (GADEEntities context = new GADEEntities(_connectionString)) 
{ 
    using (TransactionScope transaction = new TransactionScope()) 
    { 
     AddToContext1(context); 
     context.SaveChanges(); 

     AddToContext2(context); 
     context.SaveChanges(); 

     AddToContext3(context); 
     context.SaveChanges(); 
     ... 

     transaction.Complete(); 
    } 
} 

在任何时候,这可能转化为5000+插入到数据库中一个客户机上。两种方式有什么不同?

+1

什么你的测试说明了什么? – Oded 2011-04-28 18:53:11

+0

@Oded:由于项目期限紧张,我很遗憾没有时间自己做任何官方测试。在运行调试器和客户端硬件时,由于VS开销而导致VS难以告知性能。所以我希望有人能给我一个快速的答案。我最初的想法与Nik的帖子一致。你有什么想法? – jonnyb 2011-04-28 19:05:38

+1

只有想法,没有通过测试来备份......我会说所有的操作都是在EF内存中发生的,而真正的开销是网络IO在任何情况下都必须发生。微不足道的差异我会猜测。 – Oded 2011-04-28 19:08:18

回答

2

这很可能是您的第一个版本总是会更快,这取决于AddToContext究竟是什么。如果您的AddToContext方法在上下文中添加了单个或几个新对象,它肯定会更快。在每次插入之后调用SaveChanges(并且可能还会更新和删除)会极大地降低性能。

这里有一个类似的问题的几个测量:

Fastest Way of Inserting in Entity Framework

+0

感谢您回复我的旧帖子!这正是我正在寻找并验证我的预感。我必须回到我的代码中,看看如何最好地应用。再次感谢! – jonnyb 2011-05-26 19:40:57

+0

@jonnyItunes:我在我的最爱中有你的问题,因为我对这个问题也很感兴趣,但是却不知道什么是最好的选择。一两周后,我在另一个环境中自己找到答案,但忘记了你的问题。昨天在清理我的收藏夹时,我再次发现了你的问题。案件现在关闭,问题不利;) – Slauma 2011-05-26 20:15:40

+0

@jonnyItunes:只要提到这一点:周围的交易没有在性能上有所作为。我已经在两种情况下进行了测试 - 使用和不使用'TransactionScope',关于性能的结果是相同的。 – Slauma 2011-05-26 20:22:42

1

您设置的方式,我不认为有任何显着的区别。数据将以任何方式传输,这是真正的瓶颈。

1

有很大的区别,因为第二个版本是非常错误的。

你在这段代码做:

AddToContext1(context); 
context.SaveChanges(false); 

您在Added状态添加记录情境,让背景下插入记录到数据库,但在同一时间,你都在说:“让数据在添加状态“。

,如果你把这个叫做什么happesn:

AddToContext2(context); 
context.SaveChanges(false); 

您在Added状态再添条记录中添加了状态上下文,让上下文插入所有记录到数据库=第一个记录将被再次加

AddToContext实际执行更新并不重要,因为它只是再次执行DB命令。所以如果你有5.000条记录,你会插入或更新第一个5.000次!

如果你想使用第二个版本,你仍然必须在每次保存期间接受更改。

Btw。 SaveChanges超负荷接受bool在EFv4中已过时。

+0

感谢您指出我在选项​​2中的错误。根据您的回答更新了代码,以更好地反映我的问题。我目前在我的应用程序中使用第一个选项,但不知道是否有任何事情可以通过将事务拆分成更小的块来获得。 – jonnyb 2011-04-28 20:39:21