首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6事务

实体框架6事务
EN

Stack Overflow用户
提问于 2015-06-25 08:16:14
回答 3查看 731关注 0票数 2

我需要在我的两个表中插入新行,第一个表的自动生成id字段是第二个表.currently的字段之一,我正在使用事务来插入数据。我的当前代码如下所示

代码语言:javascript
复制
        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项要插入,我的当前代码会影响性能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-25 08:23:38

代码可以通过隐式事务进行改进:

代码语言:javascript
复制
foreach (var item in itemList)
{
    context.MyFirstEntity.Add(item);
    mySecondEntity.MyFirstEntity = item;
    context.MySecondEntity.Add(mySecondEntity);
}
context.SaveChanges();

注意:我没有使用id,而是使用了导航属性。

票数 4
EN

Stack Overflow用户

发布于 2015-06-25 08:25:13

当抛出异常时,您应该将事务包装在using语句中并回滚。

代码语言:javascript
复制
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();
   } 
}

更多信息,这里

票数 1
EN

Stack Overflow用户

发布于 2015-06-25 08:29:44

那得看情况。如果整个批处理必须是事务性的,那么您就没有其他方法,就像在一个大事务中一样。如果只需要为tupple保证事务,那么如果事务时间足够大,您可能会面临一些锁。然后,您可以在循环中对每个tupple进行事务处理。

此外,您也可以一次完成您正在做的事情,而不需要显式事务。您可以在循环之后进行SaveChanges,并且它将是事务性的:

代码语言:javascript
复制
foreach (var item in itemList)
{
    context.MyFirstEntity.Add(item);
    mySecondEntity.MyFirstEntity = item;
    context.MySecondEntity.Add(mySecondEntity);
}
context.SaveChanges();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31044801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档