Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何使用Entity Framework 6和我的存储库删除多个记录?_Asp.net Mvc_Entity Framework_Entity Framework 6 - Fatal编程技术网

Asp.net mvc 如何使用Entity Framework 6和我的存储库删除多个记录?

Asp.net mvc 如何使用Entity Framework 6和我的存储库删除多个记录?,asp.net-mvc,entity-framework,entity-framework-6,Asp.net Mvc,Entity Framework,Entity Framework 6,我使用的是Entity Framework 6,我有一个如下所示的存储库,其中删除了Add和Update方法以缩短存储库: public class GenericRepository<T> : IRepository<T> where T : class { public GenericRepository(DbContext dbContext) { if (dbContext == null) throw

我使用的是Entity Framework 6,我有一个如下所示的存储库,其中删除了Add和Update方法以缩短存储库:

 public class GenericRepository<T> : IRepository<T> where T : class
{
    public GenericRepository(DbContext dbContext)
    {
        if (dbContext == null) 
            throw new ArgumentNullException("An instance of DbContext is required to use this repository", "context");
        DbContext = dbContext;
        DbSet = DbContext.Set<T>();
    }

    protected DbContext DbContext { get; set; }

    protected DbSet<T> DbSet { get; set; }

    public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where<T>(predicate);
    }

    public virtual IQueryable<T> GetAll()
    {
        return DbSet;
    }

    public virtual T GetById(int id)
    {
        //return DbSet.FirstOrDefault(PredicateBuilder.GetByIdPredicate<T>(id));
        return DbSet.Find(id);
    }

    public virtual void Delete(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Deleted)
        {
            dbEntityEntry.State = EntityState.Deleted;
        }
        else
        {
            DbSet.Attach(entity);
            DbSet.Remove(entity);
        }
    }

    public virtual void Delete(int id)
    {
        var entity = GetById(id);
        if (entity == null) return; // not found; assume already deleted.
        Delete(entity);
    }
}
这适用于单个测试,但如何删除examId列值为1的所有测试
examId是测试表中的一列。

我不确定如果给定某个值,EF是否能够处理多个删除,但上次我这样做时,我不得不求助于循环

public HttpResponseMessage DeleteTest(int id)
{
  var testList = _uow.Tests.GetAll().Where(o => o.Id == id);
  if (testList.Count() == 0)
  {
      return Request.CreateResponse(HttpStatusCode.NotFound);
  }
  try
  {
      foreach (var test in testList)
      {
        _uow.Tests.Delete(test);
      }
      _uow.Commit();
      return Request.CreateResponse(HttpStatusCode.OK);
  }
  catch (Exception ex)
  {
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
  }
}

如果“test”表是链接到“ID”列上的主表的外部表,那么您可能需要考虑在这种情况下进行级联删除。

您可以在通用存储库类中创建另一个删除方法,见下文:

    public virtual void Delete(Expression<Func<T, bool>> predicate)
    {
        IQueryable<T> query = DbSet.Where(predicate).AsQueryable();
        foreach (T obj in query)
        {
            DbSet.Remove(obj);
        }
    }
您可以使用RemoveRange()

公共虚空删除(表达式谓词)
{
var query=Context.Set().Where(谓词);
Context.Set().RemoveRange(查询);
}

你的意思是
\u uow.Tests.Where(t=>t.Id==Id).Delete()
?但是我的存储库没有.Where:-(使
GetById
返回一个
Test
列表,而不是一个测试。使其返回
返回Test.Where(t=>t.Id==Id)
实际上,EF本身就是一个存储库。将存储库模式与EF一起使用就像添加了另一个不必要的抽象层。EF6引入了。类似地,还有一个
AddRange
方法。
    public virtual void Delete(Expression<Func<T, bool>> predicate)
    {
        IQueryable<T> query = DbSet.Where(predicate).AsQueryable();
        foreach (T obj in query)
        {
            DbSet.Remove(obj);
        }
    }
  _uow.Test.Delete(n => n.Id = id)
public virtual void Delete(Expression<Func<T,bool>> predicate)
{
   var query = Context.Set<T>().Where(predicate);
   Context.Set<T>().RemoveRange(query);
}