2016-04-15 2 views
0

В транзакции я должен вызывать много раз SaveChanges() или просто звонить один раз?EF6 Множественные вызовы Функция SaveChanges в транзакции

В чем разница между ними? Большое спасибо.

Могу ли я написать один раз SaveChanges() перед функцией Commit()?

using (var transaction = entities.Database.BeginTransaction()) 
{ 
    try 
    { 
     var product = entities.Product.Add(new Product() 
     { 
      Name = name, 
      Shape = shape 
     }); 

     entities.SaveChanges(); // here 

     foreach (var image in images) 
     { 

      entities.Image.Add(new Image() 
      { 
       ProductId = product.Id, 
       Url = image 
      }); 
     } 
     entities.SaveChanges(); // here 

     foreach (var specification in specifications) 
     { 

      entities.Specification.Add(new Specification() 
      { 
       Name = specification.Split(',')[0], 
       Value = specification.Split(',')[1].AsDecimal(), 
       ProductId = product.Id 
      }); 
     } 
     entities.SaveChanges(); // here 

     transaction.Commit(); 

    } 
    catch (Exception) 
    { 
     transaction.Rollback(); 
     return Json(new { status = false }); 
    } 
} 

ответ

0

Вы меняете столько, сколько вам нужно внутри набора (ов), а затем вызвать SaveChanges только один раз в контексте после того, как вы сделали все ваши изменения.

2

Большинство операций не потребует транзакции. Например, ваш код, вероятно, может быть переписан без операции путем добавления дочерних объектов в навигационные свойства на родителе, например:

var product = entities.Product.Add(new Product() 
{ 
    Name = name, 
    Shape = shape 
}); 
foreach (var image in images) 
{ 
    product.Images.Add(new Image() 
    { 
     Url = image 
    }); 
} 
foreach (var specification in specifications) 
{ 
    product.Specifications.Add(new Specification() 
    { 
     Name = specification.Split(',')[0], 
     Value = specification.Split(',')[1].AsDecimal(), 
    }); 
} 
entities.SaveChanges(); 

Ваш существующий код действительно нуждается в транзакции и требует SaveChanges после того, как продукт добавить, и в конце перед совершением транзакции. Это связано с тем, что вы ссылаетесь на product.Id добавленного объекта, который генерируется только при вызове SaveChanges. Вы можете безопасно удалить второй SaveChanges в своем коде, поскольку вы не имеете в виду сгенерированные ключи изображений.

Смежные вопросы