Обновление нескольких таблиц Entity Framework в транзакции - PullRequest
0 голосов
/ 11 сентября 2018

Когда пользователь отправляет форму, данные должны идти в несколько таблиц со ссылочной целостностью.Некоторые данные представляют сущность и вызывают saveChanges () для получения идентификатора из этого вызова.Затем нам нужно сформировать другую сущность с возвращенным идентификатором (внешний ключ в этой таблице) и вставить строку.Это происходит в транзакции.

using (var context = new XyzContext())
{
    var product = new ProductModel();
    product.Description = "Test";
    product.percentage = "20";

    using (var transactionContext = context.Database.BeginTransaction())
    {
        context.Products.Add(product);                                                            
        ObjectContext saveContext = (context as IObjectContextAdapter).ObjectContext;                            
         int recordCount = saveContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);

         if (recordCount > 0)
         {
             this.ID = product.ID;
             // Saving a audit record
             SaveHistory(userId, product.ID, ref saveContext);

             var size = new Container();
             size.Product_Id = product.ID;
             //size.Save(new List<string>() { "10", "20L", "30 Gallon" });      
             size.Save(context, new List<string>() { "10", "20L", "30 Gallon" });      
          }                                                 
          transactionContext.Commit();                           
       }                        
   }

public void Save(XyzContext context, List<string> input)
//public void Save(List<string> input)
{
    //using (var context = new Coda_Context())
    //{
        // Delete all the containers for this product_id                            
        var products = context.Container.Where(p => p.Product_Id == this.Product_Id).ToList();
        context.Product_Container.RemoveRange(products);
        context.SaveChanges();    

        // Add the passed-in containers for this product_id
        input.ForEach(i =>
        {
            var newSize = new ContainerModel()
            {
                Product_Id = this.Product_Id,
                Container_Size_Id = i
            };
            context.Container.Add(newSize);
        });
        context.saveChanges();

   // }  
 }   

Я показал два подхода в коде выше.один комментируется.Следует вставить / обновить одну строку в таблице Product и несколько строк в таблице Container.Он вставляет несколько строк продукта одним подходом и в новом контексте выдает ошибку времени ожидания.

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете выполнить эту операцию, выполнив один запрос на обновление для каждого элемента в списке. Я не думаю, что возможно выполнить несколько операций обновления с одним запросом обновления для всех элементов. Более подробная информация здесь - Пакетное обновление / удаление EF5

var ProductList=new List<string>();
using (var db=new MyContext())
{
    var container = db.Container.Where(c=>ProductList.Contains(c.ID)).ToList();
    Containers.ForEach(p =>
    {
        p.property1 = value1;
        p.property2 = value2;
    });
    db.SaveChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...