当用户提交表单时,数据应转到具有参照完整性的多个表中。一些数据表示一个实体,并调用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();
// }
}
我已经在上面的代码中展示了两种方法。一个被评论。它应在产品表中插入/更新一行,在容器表中插入/更新多行。 它使用一种方法和新的上下文插入多个产品行,从而引发超时错误。
请告知。
答案 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();
}