public class Repository : IRepository where T : BaseEntity
{
DbContext _dbContext;
public Repository(DbContext dbContext)
{
_dbContext = dbContext;
}
public int SaveChanges()
{
return _dbContext.SaveChanges();
}
public async Task SaveChangesAsync()
{
return await _dbContext.SaveChangesAsync();
}
public void Disposed()
{
throw new Exception("不允许在这里释放上下文,请在UnitOfWork中操作");
_dbContext.Dispose();
}
#region 插入数据
public bool Insert(T entity, bool isSaveChange = true)
{
_dbContext.Set().Add(entity);
if (isSaveChange)
{
return SaveChanges() > 0;
}
return false;
}
public async Task InsertAsync(T entity, bool isSaveChange = true)
{
_dbContext.Set().Add(entity);
if (isSaveChange)
{
return await SaveChangesAsync() > 0;
}
return false;
}
public bool Insert(List entitys, bool isSaveChange = true)
{
_dbContext.Set().AddRange(entitys);
if (isSaveChange)
{
return SaveChanges() > 0;
}
return false;
}
public async Task InsertAsync(List entitys, bool isSaveChange = true)
{
_dbContext.Set().AddRange(entitys);
if (isSaveChange)
{
return await SaveChangesAsync() > 0;
}
return false;
}
#endregion
#region 更新数据
public bool Update(T entity, bool isSaveChange = true, List updatePropertyList = null)
{
if (entity==null)
{
return false;
}
_dbContext.Set().Attach(entity);
if (updatePropertyList==null)
{
_dbContext.Entry(entity).State = EntityState.Modified;//全字段更新
}
else
{
updatePropertyList.ForEach(c => {
_dbContext.Entry(entity).Property(c).IsModified = true; //部分字段更新的写法
});
}
if (isSaveChange)
{
return SaveChanges() > 0;
}
return false;
}
public bool Update(List entitys, bool isSaveChange = true)
{
if (entitys==null||entitys.Count==0)
{
return false;
}
entitys.ForEach(c => {
Update(c, false);
});
if (isSaveChange)
{
return SaveChanges() > 0;
}
return false;
}
public async Task UpdateAsync(T entity, bool isSaveChange = true, List updatePropertyList = null)
{
if (entity == null)
{
return false;
}
_dbContext.Set().Attach(entity);
if (updatePropertyList == null)
{
_dbContext.Entry(entity).State = EntityState.Modified;//全字段更新
}
else
{
updatePropertyList.ForEach(c => {
_dbContext.Entry(entity).Property(c).IsModified = true; //部分字段更新的写法
});
}
if (isSaveChange)
{
return await SaveChangesAsync() > 0;
}
return false;
}
public async Task UpdateAsync(List entitys, bool isSaveChange = true)
{
if (entitys == null || entitys.Count == 0)
{
return false;
}
entitys.ForEach(c => {
_dbContext.Set().Attach(c);
_dbContext.Entry(c).State = EntityState.Modified;
});
if (isSaveChange)
{
return await SaveChangesAsync() > 0;
}
return false;
}
#endregion
#region 删除
public bool Delete(T entity, bool isSaveChange = true)
{
_dbContext.Set().Attach(entity);
_dbContext.Set().Remove(entity);
return isSaveChange ? SaveChanges() > 0 : false;
}
public bool Delete(List entitys, bool isSaveChange = true)
{
entitys.ForEach(entity =>
{
_dbContext.Set().Attach(entity);
_dbContext.Set().Remove(entity);
});
return isSaveChange ? SaveChanges() > 0 : false;
}
public virtual async Task DeleteAsync(T entity, bool isSaveChange = true)
{
_dbContext.Set().Attach(entity);
_dbContext.Set().Remove(entity);
return isSaveChange ? await SaveChangesAsync() > 0 : false;
}
public virtual async Task DeleteAsync(List entitys, bool isSaveChange = true)
{
entitys.ForEach(entity =>
{
_dbContext.Set().Attach(entity);
_dbContext.Set().Remove(entity);
});
return isSaveChange ? await SaveChangesAsync() > 0 : false;
}
#endregion
public IQueryable Entities => _dbContext.Set().AsQueryable().AsNoTracking();
//public async Task> EntitiesAsync => Task.Run(()=> _dbContext.Set().AsQueryable().AsNoTracking());
public DatabaseFacade Database => _dbContext.Database;
#region 查找
public T Get(object id)
{
return _dbContext.Set().Find(id);
}
public T Get(Expression> predicate = null)
{
return _dbContext.Set().Where(predicate).AsNoTracking().FirstOrDefault();
}
public async Task GetAsync(object id)
{
return await _dbContext.Set().FindAsync(id);
}
public async Task GetAsync(Expression> predicate = null)
{
return await _dbContext.Set().Where(predicate).AsNoTracking().FirstOrDefaultAsync();
}
public async Task> GetListAsync(Expression> predicate = null)
{
return await _dbContext.Set().Where(predicate).AsNoTracking().ToListAsync();
}
public async Task> LoadAsync(Expression> predicate = null)
{
if (predicate == null)
{
predicate = c => true;
}
return await Task.Run(() => _dbContext.Set().Where(predicate).AsNoTracking());
}
public void Dispose()
{
throw new NotImplementedException();
}
#endregion
}