我使用AutoMapper从旧的数据库对象映射到EF代码首先声明了一个新的数据库:提高在种子中初始化DbSet的性能?
StartTimer("Map Customers");
var mfpCustomers = Mapper.Map<IEnumerable<LegacyDataModel.Customer>, IEnumerable<Customer>>(
legacyEntities.Customers.Include(p => p.Demographics).ToList());
StopAndPrintTimer("Map Customers");
StartTimer("Iterate Customers");
foreach (var p in mfpCustomers)
{
db.Customers.Add(p);
}
StopAndPrintTimer("Iterate Customers");
的每个是什么花费最多的时间。我想直接映射到DbSet(db.Customer)
,而不是通过db.Customers.Add(p);
做一个foreach。我还没有想出如何做到这一点,因为没有什么像专门为添加大量对象而设计的AddRange
方法。我知道如何在SQL中使用基于集合的技术来完成这些类型的转换,但这是一种疯狂的打字量,因为智能感知在SSMS中的这些情景中不起作用。
这段代码并不需要超快速,但是每次我种下数据库时都要等上一整分钟,这使得开发变得困难(并且由于新数据库的快速开发,它确实需要经常重新调整) 。还要注意,由于这是种子方法,我不介意完全取代现有的客户(因为没有)。所以在这方面它不需要表现得像AddRange,因为我真的只是创建一个新的集合。
有关如何在此提高性能的任何想法? 关于如何将整个集合直接映射到DbSet而不对每个实例进行foreach的任何想法?
这是伟大的。如果我在自动检测恢复为真前调用SaveChanges,它似乎会更快。它是否可以正确保存或以任何理由先于另一个?在实现这个之后,我注意到一些奇怪的地方,即使我使用了DropCreateDatabaseAlways,我的初始化程序根本没有被调用。我实际上必须清理并重建项目,以强制它调用我的种子函数。 – AaronLS 2012-02-27 19:08:20
在这种情况下,如果您在再次切换DetectChanges之前调用SaveChanges,它应该保存得很好。如果您在添加它们并调用SaveChanges之间做任何其他操作,则可能无法正确保存。 – 2012-02-27 19:41:44