事务中的实体框架多表更新

时间:2018-09-11 20:03:08

标签: sql-server entity-framework-6 c#-3.0

当用户提交表单时,数据应转到具有参照完整性的多个表中。一些数据表示一个实体,并调用saveChanges()从此调用中获取ID。然后,我们需要形成另一个ID为返回的实体(此表上的外键)并插入一行。这是在交易中发生的。

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();

   // }  
 }   

我已经在上面的代码中展示了两种方法。一个被评论。它应在产品表中插入/更新一行,在容器表中插入/更新多行。 它使用一种方法和新的上下文插入多个产品行,从而引发超时错误。

请告知。

1 个答案:

答案 0 :(得分:0)

您可以通过对列表中的每个元素执行一个更新查询来执行此操作。我认为不可能对所有元素使用一个更新查询来执行多个更新操作。这里的更多信息-Batch update/delete 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();
}