我需要在我的两个表中插入新行,第一个表的自动生成id字段是第二个表.currently的字段之一,我正在使用事务来插入数据。我的当前代码如下所示
using (var context = new ApplicationDatabaseEntities())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
foreach (var item in itemList)
{
context.MyFirstEntity.Add(item);
context.SaveChanges();
mySecondEntity.MyFirstEntityId = item.Id;
context.MySecondEntity.Add(mySecondEntity.MyFirstEntityId );
context.SaveChanges();
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine(ex);
}
}
}上面的代码运行良好,.my问题是,这是正确的方式吗?我的意思是,如果我有1000或2000项要插入,我的当前代码会影响性能吗?
发布于 2015-06-25 08:23:38
代码可以通过隐式事务进行改进:
foreach (var item in itemList)
{
context.MyFirstEntity.Add(item);
mySecondEntity.MyFirstEntity = item;
context.MySecondEntity.Add(mySecondEntity);
}
context.SaveChanges();注意:我没有使用id,而是使用了导航属性。
发布于 2015-06-25 08:25:13
当抛出异常时,您应该将事务包装在using语句中并回滚。
using (DbContextTransaction transaction = context.Database.BeginTransaction())
{
try
{
foreach (var item in itemList)
{
context.MyFirstEntity.Add(item);
mySecondEntity.MyFirstEntity = item;
context.MySecondEntity.Add(mySecondEntity);
}
transaction.Commit();
}
catch (Exception e)
{
transaction.Rollback();
}
}更多信息,这里。
发布于 2015-06-25 08:29:44
那得看情况。如果整个批处理必须是事务性的,那么您就没有其他方法,就像在一个大事务中一样。如果只需要为tupple保证事务,那么如果事务时间足够大,您可能会面临一些锁。然后,您可以在循环中对每个tupple进行事务处理。
此外,您也可以一次完成您正在做的事情,而不需要显式事务。您可以在循环之后进行SaveChanges,并且它将是事务性的:
foreach (var item in itemList)
{
context.MyFirstEntity.Add(item);
mySecondEntity.MyFirstEntity = item;
context.MySecondEntity.Add(mySecondEntity);
}
context.SaveChanges();https://stackoverflow.com/questions/31044801
复制相似问题