我正在使用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警告:
我的问题是为什么我使用事务但仍然有重复的sql警告?
谢谢。
答案 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之间没有区别,但是你应该先检查一下状态吗?