在Entity Framework 6中的一个事务中删除多行时重复查询

时间:2014-07-24 08:44:39

标签: entity-framework entity-framework-6 mvc-mini-profiler

我正在使用EF 6并拥有这样的存储库类:

public class EfRepository<T> : IRepository<T> where T : class
{
    private readonly DbContext _context;

    public EfRepository(DbContext context)
    {
        _context = context;
    }
    ....
    public void Delete(IEnumerable<T> entities)
    {
        // skip checks
        using (var transaction = _context.Database.BeginTransaction())
        {
            try
            {
                _context.Set<T>().RemoveRange(entities);
                _context.SaveChanges();
                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
            }
        }
    }

在我的控制器中,我将存储库实例IRepository<Connection> _repository与使用Autofac绑定到EfRepository类。

然后我删除多个项目(一切正常!):

IEnumerable<Connection> connections = // get some connections;
_repository.Delete(connections); // everything fine - records was removed

但是当我打开安装了MiniProfiler的网站时,它会向我显示重复的sql-query警告: MiniProfiler warning

我的问题是为什么我使用事务但仍然有重复的sql警告?

谢谢。

2 个答案:

答案 0 :(得分:2)

这是因为Entity Framework当前每个要删除的项目都会发送一个查询。它不会将它们全部分批到一个查询中。因此,MiniProfiler正确报告正在发生的事情 - 正在提交重复删除查询(param值除外)。

答案 1 :(得分:0)

你的交易是什么。承诺()在做什么?也许你可以在你的问题中添加这个方法的代码。

我也在删除数据库中的entites,但更像是这样:

public virtual void Delete(TEntity entityToDelete)
        {
            if (Context.Entry(entityToDelete).State == EntityState.Detached)
            {
                DBSet.Attach(entityToDelete);
            }
            DBSet.Remove(entityToDelete);
        }

我认为Remove和RemoveRange之间没有区别,但是你应该先检查一下状态吗?