2013-11-27 4 views
0

У меня есть следующий код, который обновляет/добавляет данные в базу данных SQL Server CE с EF6, которая отлично работает для небольшого количества записей. Однако, когда объем записей превышает 1000 ~ 2000, транзакция становится очень медленной (10 ~ 15 секунд). Есть ли способ его оптимизировать?SQL Server CE EF Оптимизация

Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0", "", MyProject.ConnectionString); 

ProjectContext context = new ProjectContext(); 
context.Configuration.AutoDetectChangesEnabled = false; 
context.Configuration.ValidateOnSaveEnabled = false; 

using (var db = new ProjectContext()) 
{   
    foreach (var item in MyProject.Brands) 
    { 
     if (!db.Brands.Any(i => i.Name == item.Name)) 
     { 
      // Add 
      db.Brands.Add(item); 
     } 
     else 
     { 
      // Update 
      var found = db.Brands.First(i => i.Name == item.Name); 
      found = item; 
     } 
    } 

    db.SaveChangesAsync(); 
+1

Попробуйте создать словарь торговых марок вместо того, чтобы просматривать все их каждый раз. В противном случае используйте 'FirstOrDefault', чтобы получить доступ к« Бренду »одновременно с выяснением, существует ли он или нет. –

+0

Также я не уверен 'found = item;' делает то, что вы думаете, что он делает ... –

+0

спасибо за ответ, я не уверен в словаре, так как я планировал расширить транзакцию базы данных до 100000 записей. Кстати, найденный обновляет строку после ее обнаружения. – Jim

ответ

2

Таким образом, вы экономите 50% от ваших запросов Linq, и ваше обновление может реально работать (ваш MyProject.Brands не прикрепляются каким-либо образом к вашему new ProjectContext, что вы используете, в found, что вы извлечь оттуда есть прилагается, но в исходном коде, вы переписал его с yuor item, то есть он будет проигнорирован. context я ушла полностью, как вы были с этим ничего не делать, так как вы используете создает новый ProjectContext в любом случае.

using (var db = new ProjectContext()) 
{   
    foreach (var item in MyProject.Brands) 
    { 
     var found = db.Brands.FirstOrdefault(i => i.Name == item.Name); 
     if (found == null) 
     { 
      // Add 
      db.Brands.Add(item); 
     } 
     else 
     { 
      // Update 
      found.prop1 = item.prop1; 
      found.prop2 = item.prop2; 
      // ... etc, for all and any updatable properties 
     } 
    } 
    db.SaveChangesAsync(); 
} 
Смежные вопросы