1、实体类封装
public interface IEntity<TPrimaryKey>
{
TPrimaryKey Id { get; set; }
bool IsTransient();
}
public interface IEntity : IEntity<int>
{
}
public interface IEntityFull<TPrimaryKey> : IEntity<TPrimaryKey>
{
/// <summary>
/// 创建时间
/// </summary>
DateTime CreateTime { get; set; }
/// <summary>
/// 创建人
/// </summary>
string CreateOperator { get; set; }
/// <summary>
/// 最后更新时间
/// </summary>
DateTime LastUpdateTime { get; set; }
/// <summary>
/// 最后更新
/// </summary>
string LastUpdateOperator { get; set; }
/// <summary>
/// 数据的有效性
/// </summary>
EnumDataEntityStatus EnumDataEntityStatus { get; set; }
}
public interface IEntityFull : IEntityFull<int>
{
}
[Serializable]
public abstract class Entity<TPrimaryKey> : IEntityFull<TPrimaryKey>
{
public Entity()
{
EnumDataEntityStatus = EnumDataEntityStatus.Normal;
if (CreateTime == default(DateTime))
{
CreateTime = DateTime.Now;
}
LastUpdateTime = DateTime.Now;
}
public virtual TPrimaryKey Id { get; set; }
public virtual EnumDataEntityStatus EnumDataEntityStatus { get; set; }
public virtual DateTime CreateTime { get; set; }
public virtual DateTime LastUpdateTime { get; set; }
public virtual string CreateOperator { get; set; }
public virtual string LastUpdateOperator { get; set; }
/// <summary>
/// Checks if this entity is transient (it has not an Id).
/// </summary>
/// <returns>True, if this entity is transient</returns>
public virtual bool IsTransient()
{
if (EqualityComparer<TPrimaryKey>.Default.Equals(Id, default(TPrimaryKey)))
{
return true;
}
//Workaround for EF Core since it sets int/long to min value when attaching to dbcontext
if (typeof(TPrimaryKey) == typeof(int))
{
return Convert.ToInt32(Id) <= 0;
}
if (typeof(TPrimaryKey) == typeof(long))
{
return Convert.ToInt64(Id) <= 0;
}
return false;
}
/// <inheritdoc/>
public override int GetHashCode()
{
return Id.GetHashCode();
}
/// <inheritdoc/>
public override string ToString()
{
return $"[{GetType().Name} {Id}]";
}
}
[Serializable]
public abstract class Entity : Entity<int>, IEntityFull
{
}
[Table(name: "users", Schema = "dbo")]
[Description("用户信息")]
public class User : Entity<int>
{
public User()
{
this.Account = string.Empty;
this.Password = string.Empty;
}
/// <summary>
/// 用户名
/// </summary>
[Required]
public string Account { get; set; }
/// <summary>
///
/// </summary>
[Required]
public string Password { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 性别
/// </summary>
public int? Sex { get; set; }
/// <summary>
/// 业务code
/// </summary>
public string BizCode { get; set; }
/// <summary>
/// 用户类型
/// </summary>
public int TypeId { get; set; }
/// <summary>
///
/// </summary>
public string TypeName { get; set; }
}
2、EF类继承及封装基础操作类
* 需要扩展 Z.EntityFramework.Plus 第三方查件,此插件不仅提供了方便的操作,也提高了EF的效率
* EF DbSet对象使用访问程序及实现
public class EFDbContext : DbContext
{
//public EFDbContext()
// : base("MSDBContext") {
// EntityMappers = GetEntityMappers();
//}
public EFDbContext(string connectionString)
: base(connectionString)
{
EntityMappers = GetEntityMappers();
}
public EFDbContext(DbConnection existingConnection)
: base(existingConnection, true) {
EntityMappers = GetEntityMappers();
}
//public virtual DbSet<User> User { get; set; }
private static List<Type> EntityMappers { get; set; }
/// <summary>
/// 获取需要加载DbSet的类
/// </summary>
/// <returns></returns>
private List<Type> GetEntityMappers()
{
List<Type> types = new List<Type>();
CustomAssemblySection configSection = (CustomAssemblySection)System.Configuration.ConfigurationManager.GetSection("CustomAssemblySection");
foreach (CustomAssemblyElement customAssembly in configSection.Assemblies)
{
Assembly assembly = Assembly.Load(customAssembly.Name);
foreach (Type type in assembly.ExportedTypes)
{
if (!type.IsClass) continue;
var tableattrd = type.GetCustomAttribute(typeof(TableAttribute));
if (tableattrd != null)
{
types.Add(type);
}
}
}
return types;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
foreach (var type in EntityMappers)
{
MethodInfo method = modelBuilder.GetType().GetMethod("Entity");
method = method.MakeGenericMethod(new Type[] { type });
method.Invoke(modelBuilder, null);
}
base.OnModelCreating(modelBuilder);
}
}
public class BaseRepository<TEntity, TPrimaryKey>
: IDisposable,IRepository<TEntity, TPrimaryKey>
where TEntity : class, IEntityFull<TPrimaryKey>
{
/// <summary>
/// Gets EF DbContext object.
/// </summary>
public DbContext DbContext { get; set; }
/// <summary>
///
/// </summary>
private static string AppSettingKey => (ConfigurationManager.AppSettings["DatabaseType"]);
/// <summary>
/// 默认数据类型
/// </summary>
private static EnumDatabaseType _databaseType = (EnumDatabaseType)Enum.Parse(typeof(EnumDatabaseType), AppSettingKey);
#region 构造函数
public BaseRepository()
:this(_databaseType){
}
public BaseRepository(EnumDatabaseType datatype, string connstr)
{
switch (datatype)
{
case EnumDatabaseType.MySql:
DbContext = new MysqlDbContext(connstr);
break;
default:
DbContext = new MSsqlDbContext(connstr);
break;
}
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="dbContext"></param>
public BaseRepository(DbContext dbContext)
{
DbContext = dbContext;
}
public BaseRepository(EnumDatabaseType datatype,bool isConnection = false)
{
DbConnection connection = isConnection ? GetDbConnection(AppSettingKey) : null;
switch (datatype)
{
case EnumDatabaseType.MySql:
DbContext = isConnection ? new MysqlDbContext(connection) : new MysqlDbContext();
break;
default:
DbContext = isConnection ? new MSsqlDbContext(connection) : new MSsqlDbContext();
break;
}
}
/// <summary>
/// 获取连接
/// </summary>
/// <returns></returns>
private DbConnection GetDbConnection(string appkey) {
DbConnection connection = null;
//获取连接字符
var connectionKey = appkey + "Context";
var connectionProvider = ConfigHelper.GetConnString(connectionKey);
if (string.IsNullOrEmpty(connectionProvider.ProviderName)) return null;
//创建连接
var dbFactory = DbProviderFactories.GetFactory(connectionProvider.ProviderName);
connection = dbFactory.CreateConnection();
connection.ConnectionString = connectionProvider.ConnectionString;
return connection;
}
#endregion
#region Basic
/// <summary>
/// 异步提交
/// </summary>
/// <returns></returns>
public async Task<int> SaveChangesAsync()
{
return await DbContext.SaveChangesAsync();
}
/// <summary>
/// 保存
/// </summary>
/// <returns></returns>
public int SaveChanges()
{
return DbContext.SaveChanges();
}
/// <summary>
/// 数据库连接
/// </summary>
public DbConnection Connection
{
get
{
var connection = DbContext.Database.Connection;
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
return connection;
}
}
/// <summary>
/// 获取数据
/// </summary>
public DbSet<TEntity> Table => DbContext.Set<TEntity>();
/// <summary>
/// 获取IQueryable
/// </summary>
public IQueryable<TEntity> Entities => DbContext.Set<TEntity>();
IQueryable<TEntity> IRepository<TEntity, TPrimaryKey>.Entities => this.Entities;
//DbSet<IEntity> IRepository<IEntity, TPrimaryKey>.Table => throw new NotImplementedException();
/// <summary>
/// 获取实体所有数据
/// </summary>
/// <returns></returns>
public IQueryable<TEntity> GetAll()
{
return Table;
}
public IQueryable<TEntity> GetIncluding(params Expression<Func<TEntity, object>>[] propertySelectors)
{
if (propertySelectors == null || !propertySelectors.Any())
{
return GetAll();
}
var query = GetAll();
foreach (var propertySelector in propertySelectors)
{
query = query.Include(propertySelector);
}
return query;
}
/// <summary>
///
/// </summary>
/// <param name="entity"></param>
protected void AttachIfNot(TEntity entity)
{
if (!Table.Local.Contains(entity))
{
Table.Attach(entity);
}
}
#endregion
#region 查询单个对象
/// <summary>
/// 根据ID查询实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public TEntity Get(TPrimaryKey id)
{
return Table.Find(id);
}
/// <summary>
/// 根据ID查询实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<TEntity> GetAsync(TPrimaryKey id)
{
return await Table.FindAsync(id);
}
/// <summary>
/// 根据条件获取第一条数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public TEntity GetFirstOrDefault(Expression<Func<TEntity, bool>> predicate)
{
return GetAll().FirstOrDefault(predicate);
}
/// <summary>
/// 根据条件获取第一条数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public async Task<TEntity> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate)
{
return await GetAll().FirstOrDefaultAsync(predicate);
}
/// <summary>
/// 根据条件查询实体
/// </summary>
/// <param name="predicates"></param>
/// <returns></returns>
public TEntity Get(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return query.FirstOrDefault();
}
/// <summary>
/// 根据条件查询实体
/// </summary>
/// <param name="predicates"></param>
/// <returns></returns>
public async Task<TEntity> GetAsync(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return await query.FirstOrDefaultAsync();
}
#endregion
#region 查询列表
/// <summary>
/// 获取所有数据
/// </summary>
/// <returns></returns>
public List<TEntity> GetList()
{
return GetAll().ToList();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public async Task<List<TEntity>> GetListAsync()
{
return await GetAll().ToListAsync();
}
/// <summary>
/// 根据条件获取数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public List<TEntity> GetList(Expression<Func<TEntity, bool>> predicate)
{
return GetAll().Where(predicate).ToList();
}
/// <summary>
/// 根据条件获取数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public async Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> predicate)
{
return await GetAll().Where(predicate).ToListAsync();
}
/// <summary>
/// 根据条件集合查询数据
/// </summary>
/// <param name="predicates"></param>
/// <returns></returns>
public List<TEntity> GetList(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return query.ToList();
}
/// <summary>
/// 根据条件集合查询数据
/// </summary>
/// <param name="predicates"></param>
/// <returns></returns>
public async Task<List<TEntity>> GetListAsync(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return await query.ToListAsync();
}
#endregion
#region 分页查询
/// <summary>
///
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="pageSize">每页显示条数</param>
/// <param name="pageIndex">当前页数</param>
/// <param name="total">总共条数</param>
/// <param name="predicate">条件</param>
/// <param name="isAsc">是否顺序</param>
/// <param name="orderByLambda">排序字段</param>
/// <returns></returns>
public IQueryable<TEntity> LoadPagerEntities(int pageSize, int pageIndex, out int total,
Expression<Func<TEntity, bool>> predicate, bool isAsc, Expression<Func<TEntity, TPrimaryKey>> orderByLambda)
{
var tempData = GetAll().Where(predicate);
total = tempData.Count();
//排序获取当前页的数据
if (isAsc)
{
tempData = tempData.OrderBy(orderByLambda).
Skip<TEntity>(pageSize * (pageIndex - 1)).
Take<TEntity>(pageSize).AsQueryable();
}
else
{
tempData = tempData.OrderByDescending(orderByLambda).
Skip<TEntity>(pageSize * (pageIndex - 1)).
Take<TEntity>(pageSize).AsQueryable();
}
return tempData.AsQueryable();
}
/// <summary>
/// 分页处理
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="orderExpressions"></param>
/// <returns></returns>
public List<TEntity> GetList(int pageIndex, int pageSize, params OrderParameter<TEntity, TPrimaryKey>[] orderExpressions)
{
return GetAll().QueryPaged(pageIndex, pageSize, orderExpressions).ToList();
}
/// <summary>
/// 分页处理
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="orderExpressions"></param>
/// <returns></returns>
public async Task<List<TEntity>> GetListAsync(int pageIndex, int pageSize,
params OrderParameter<TEntity, TPrimaryKey>[] orderExpressions)
{
return await GetAll().QueryPaged(pageIndex, pageSize, orderExpressions).ToListAsync();
}
/// <summary>
/// 过滤后条件后进行分页处理
/// </summary>
/// <param name="predicate">过滤条件</param>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="orderExpressions"></param>
/// <returns>List of all entities</returns>
public List<TEntity> GetList(Expression<Func<TEntity, bool>> predicate, int pageIndex, int pageSize,
params OrderParameter<TEntity, TPrimaryKey>[] orderExpressions)
{
return GetAll().Where(predicate).QueryPaged(pageIndex, pageSize, orderExpressions).ToList();
}
/// <summary>
/// 过滤后条件后进行分页处理
/// </summary>
/// <param name="predicate">过滤条件</param>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="orderExpressions"></param>
/// <returns>List of all entities</returns>
public async Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> predicate, int pageIndex,
int pageSize, params OrderParameter<TEntity, TPrimaryKey>[] orderExpressions)
{
return await GetAll().Where(predicate).QueryPaged(pageIndex, pageSize, orderExpressions).ToListAsync();
}
/// <summary>
/// 过滤后条件后进行分页处理
/// </summary>
/// <param name="predicates">过滤条件集</param>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="orderExpressions"></param>
/// <returns>List of all entities</returns>
public List<TEntity> GetList(List<Expression<Func<TEntity, bool>>> predicates, int pageIndex, int pageSize,
params OrderParameter<TEntity, TPrimaryKey>[] orderExpressions)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return query.QueryPaged(pageIndex, pageSize, orderExpressions).ToList();
}
/// <summary>
/// 过滤后条件后进行分页处理
/// </summary>
/// <param name="predicates">过滤条件集</param>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="orderExpressions"></param>
/// <returns>List of all entities</returns>
public async Task<List<TEntity>> GetListAsync(List<Expression<Func<TEntity, bool>>> predicates, int pageIndex, int pageSize, params OrderParameter<TEntity, TPrimaryKey>[] orderExpressions)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return await query.QueryPaged(pageIndex, pageSize, orderExpressions).ToListAsync();
}
#endregion
#region 新增
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit"></param>
/// <returns></returns>
public TEntity Insert(TEntity entity, bool isCommit = true)
{
entity = Table.Add(entity);
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public async Task<TEntity> InsertAsync(TEntity entity, bool isCommit = true)
{
entity = Table.Add(entity);
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit"></param>
/// <returns></returns>
public TEntity Insert(TEntity entity, Operater op, bool isCommit = true)
{
SetTraceInfo(entity, op);
entity = Table.Add(entity);
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public async Task<TEntity> InsertAsync(TEntity entity, Operater op, bool isCommit = true)
{
SetTraceInfo(entity, op);
entity = Table.Add(entity);
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public int InsertList(List<TEntity> entitys, bool isCommit = true)
{
if (entitys == null || !entitys.Any())
return 0;
Table.AddRange(entitys);
return isCommit ? SaveChanges() : 0;
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public async Task<int> InsertListAsync(List<TEntity> entitys, bool isCommit = true)
{
if (entitys == null || !entitys.Any())
return 0;
Table.AddRange(entitys);
return isCommit ? await SaveChangesAsync() : await Task.FromResult(0);
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public int InsertList(List<TEntity> entitys, Operater op, bool isCommit = true)
{
if (entitys == null || !entitys.Any())
return 0;
entitys.ForEach(e =>
{
SetTraceInfo(e, op);
});
Table.AddRange(entitys);
return isCommit ? SaveChanges() : 0;
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public async Task<int> InsertListAsync(List<TEntity> entitys, Operater op, bool isCommit = true)
{
if (entitys == null || !entitys.Any())
return 0;
entitys.ForEach(e =>
{
SetTraceInfo(e, op);
});
Table.AddRange(entitys);
return isCommit ? await SaveChangesAsync() : await Task.FromResult(0);
}
#endregion
#region 更新
/// <summary>
/// 更新数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public TEntity Update(TEntity entity, bool isCommit = true)
{
AttachIfNot(entity);
DbContext.Entry(entity).State = EntityState.Modified;
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 更新数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否提交保存</param>
/// <returns></returns>
public async Task<TEntity> UpdateAsync(TEntity entity, bool isCommit = true)
{
AttachIfNot(entity);
DbContext.Entry(entity).State = EntityState.Modified;
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 更新数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public TEntity Update(TEntity entity, Operater op, bool isCommit = true)
{
SetTraceInfo(entity, op);
AttachIfNot(entity);
DbContext.Entry(entity).State = EntityState.Modified;
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 更新数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public async Task<TEntity> UpdateAsync(TEntity entity, Operater op, bool isCommit = true)
{
SetTraceInfo(entity, op);
AttachIfNot(entity);
DbContext.Entry(entity).State = EntityState.Modified;
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 根据主键id查询
/// </summary>
/// <param name="id">主键id</param>
/// <param name="updateAction">更新操作</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public TEntity Update(TPrimaryKey id, Action<TEntity> updateAction, bool isCommit = true)
{
var entity = Get(id);
updateAction(entity);
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 根据主键id查询
/// </summary>
/// <param name="id">主键id</param>
/// <param name="updateAction">更新操作</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public async Task<TEntity> UpdateAsync(TPrimaryKey id, Func<TEntity, Task> updateAction, bool isCommit = true)
{
var entity = await GetAsync(id);
await updateAction(entity);
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 根据主键id查询
/// </summary>
/// <param name="id">主键id</param>
/// <param name="updateAction">更新操作</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public TEntity Update(TPrimaryKey id, Action<TEntity> updateAction, Operater op, bool isCommit = true)
{
var entity = Get(id);
SetTraceInfo(entity, op);
updateAction(entity);
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 根据主键id查询
/// </summary>
/// <param name="id">主键id</param>
/// <param name="updateAction">更新操作</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public async Task<TEntity> UpdateAsync(TPrimaryKey id, Func<TEntity, Task> updateAction, Operater op, bool isCommit = true)
{
var entity = await GetAsync(id);
SetTraceInfo(entity, op);
await updateAction(entity);
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 根据条件更新
/// </summary>
/// <param name="predicate"></param>
/// <param name="updateAction"></param>
/// <returns></returns>
public int Update(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TEntity>> updateAction)
{
return GetAll().Where(predicate).Update(updateAction);
}
/// <summary>
/// 根据条件更新
/// </summary>
/// <param name="predicate"></param>
/// <param name="updateAction"></param>
/// <returns></returns>
public async Task<int> UpdateAsync(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TEntity>> updateAction)
{
return await GetAll().Where(predicate).UpdateAsync(updateAction);
}
/// <summary>
/// 根据条件集跟新数据
/// </summary>
/// <param name="predicates"></param>
/// <param name="updateAction"></param>
/// <returns></returns>
public int Update(List<Expression<Func<TEntity, bool>>> predicates, Expression<Func<TEntity, TEntity>> updateAction)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return query.Update(updateAction);
}
/// <summary>
/// 根据条件集跟新数据
/// </summary>
/// <param name="predicates"></param>
/// <param name="updateAction"></param>
/// <returns></returns>
public async Task<int> UpdateAsync(List<Expression<Func<TEntity, bool>>> predicates, Expression<Func<TEntity, TEntity>> updateAction)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return await query.UpdateAsync(updateAction);
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public TEntity Save(TEntity entity, bool isCommit = true)
{
if (entity.IsTransient())
{
Insert(entity, isCommit);
}
else
{
Update(entity, isCommit);
}
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit"></param>
/// <returns></returns>
public async Task<TEntity> SaveAsync(TEntity entity, bool isCommit = true)
{
if (entity.IsTransient())
{
await InsertAsync(entity);
}
else
{
await UpdateAsync(entity);
}
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="op">操作人</param>
/// <param name="isCommit">是否保存</param>
/// <returns></returns>
public TEntity Save(TEntity entity, Operater op, bool isCommit = true)
{
SetTraceInfo(entity, op);
if (entity.IsTransient())
{
Insert(entity, op, isCommit);
}
else
{
Update(entity, op, isCommit);
}
if (isCommit)
{
SaveChanges();
}
return entity;
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="entity">实体</param>
/// <param name="isCommit"></param>
/// <returns></returns>
public async Task<TEntity> SaveAsync(TEntity entity, Operater op, bool isCommit = true)
{
SetTraceInfo(entity, op);
if (entity.IsTransient())
{
await InsertAsync(entity);
}
else
{
await UpdateAsync(entity);
}
if (isCommit)
{
await SaveChangesAsync();
}
return await Task.FromResult(entity);
}
/// <summary>
/// 保存数据集
/// </summary>
/// <param name="entities"></param>
/// <param name="isCommit"></param>
/// <returns></returns>
public int Save(List<TEntity> entities, bool isCommit = true)
{
foreach (var entity in entities)
{
if (entity.IsTransient())
{
Insert(entity, false);
}
else
{
Update(entity, false);
}
}
return isCommit ? SaveChanges() : 0;
}
/// <summary>
/// 保存数据集
/// </summary>
/// <param name="entities"></param>
/// <param name="isCommit"></param>
/// <returns></returns>
public async Task<int> SaveAsync(List<TEntity> entities, bool isCommit = true)
{
foreach (var entity in entities)
{
if (entity.IsTransient())
{
Insert(entity);
}
else
{
Update(entity);
}
}
return isCommit ? await SaveChangesAsync() : await Task.FromResult(0);
}
/// <summary>
/// 保存数据集
/// </summary>
/// <param name="entities"></param>
/// <param name="isCommit"></param>
/// <returns></returns>
public int Save(List<TEntity> entities,Operater op, bool isCommit = true)
{
foreach (var entity in entities)
{
SetTraceInfo(entity,op);
if (entity.IsTransient())
{
Insert(entity, false);
}
else
{
Update(entity, false);
}
}
return isCommit ? SaveChanges() : 0;
}
/// <summary>
/// 保存数据集
/// </summary>
/// <param name="entities"></param>
/// <param name="isCommit"></param>
/// <returns></returns>
public async Task<int> SaveAsync(List<TEntity> entities, Operater op, bool isCommit = true)
{
foreach (var entity in entities)
{
SetTraceInfo(entity, op);
if (entity.IsTransient())
{
Insert(entity);
}
else
{
Update(entity);
}
}
return isCommit ? await SaveChangesAsync() : await Task.FromResult(0);
}
#endregion
#region 删除
/// <summary>
/// 删除数据
/// </summary>
/// <param name="entity"></param>
/// <param name="isCommit"></param>
/// <returns></returns>
public TEntity Delete(TEntity entity, bool isCommit = true)
{
AttachIfNot(entity);
TEntity result = Table.Remove(entity);
if (isCommit)
{
SaveChanges();
}
return result ?? default(TEntity);
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="entity"></param>
/// <param name="isCommit"></param>
/// <returns></returns>
public async Task DeleteAsync(TEntity entity, bool isCommit = true)
{
Table.Remove(entity);
if (isCommit)
{
await SaveChangesAsync();
}
}
/// <summary>
/// 根据id删除数据
/// </summary>
/// <param name="id"></param>
/// <param name="isCommit"></param>
public void Delete(TPrimaryKey id, bool isCommit = true)
{
var entity = Table.Local.FirstOrDefault(ent => EqualityComparer<TPrimaryKey>.Default.Equals(ent.Id, id));
if (entity == null)
{
entity = Get(id);
if (entity == null)
{
return;
}
}
Delete(entity, isCommit);
}
/// <summary>
/// 根据id删除数据
/// </summary>
/// <param name="id"></param>
/// <param name="isCommit"></param>
/// <returns></returns>
public async Task DeleteAsync(TPrimaryKey id, bool isCommit = true)
{
var entity = Table.Local.FirstOrDefault(ent => EqualityComparer<TPrimaryKey>.Default.Equals(ent.Id, id));
if (entity == null)
{
entity = Get(id);
if (entity == null)
{
return;
}
}
await DeleteAsync(entity, isCommit);
}
/// <summary>
/// 根据条件删除数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public int Delete(Expression<Func<TEntity, bool>> predicate)
{
return GetAll().Where(predicate).Delete();
}
/// <summary>
/// 根据条件删除数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public async Task DeleteAsync(Expression<Func<TEntity, bool>> predicate)
{
await GetAll().Where(predicate).DeleteAsync();
}
/// <summary>
/// 根据条件集删除数据
/// </summary>
/// <param name="predicates"></param>
public void Delete(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
query.Delete();
}
/// <summary>
/// 根据条件集删除数据
/// </summary>
/// <param name="predicates"></param>
/// <returns></returns>
public async Task DeleteAsync(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
await query.DeleteAsync();
}
#endregion
#region count
/// <summary>
/// 获取总数量
/// </summary>
/// <returns></returns>
public long Count()
{
return GetAll().LongCount();
}
/// <summary>
/// 获取总数量
/// </summary>
/// <returns></returns>
public async Task<long> CountAsync()
{
return await GetAll().LongCountAsync();
}
/// <summary>
/// 条件筛选获取总数量
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public long Count(Expression<Func<TEntity, bool>> predicate)
{
return GetAll().Where(predicate).LongCount();
}
/// <summary>
/// 条件筛选获取总数量
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public async Task<long> CountAsync(Expression<Func<TEntity, bool>> predicate)
{
return await GetAll().Where(predicate).LongCountAsync();
}
/// <summary>
/// 条件集筛选获取总数量
/// </summary>
/// <param name="predicates"></param>
/// <returns></returns>
public long Count(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return query.LongCount();
}
/// <summary>
/// 条件集筛选获取总数量
/// </summary>
/// <param name="predicates"></param>
/// <returns></returns>
public async Task<long> CountAsync(List<Expression<Func<TEntity, bool>>> predicates)
{
var query = GetAll();
foreach (var expression in predicates)
{
query = query.Where(expression);
}
return await query.LongCountAsync();
}
#endregion
#region 初始化值 Operater
private void SetTraceInfo(TEntity entity, Operater operater)
{
IEntityFull traceEntity = entity as IEntityFull;
if (traceEntity != null)
{
if (traceEntity.Id == 0)
{
traceEntity.LastUpdateTime = DateTime.Now;
traceEntity.LastUpdateOperator = operater.Name;
traceEntity.CreateOperator = operater.Name;
}
else if (!operater.Name.StartsWith("["))//以[开头的操作人是系统程序,只做历史记录,就不在实体本身记录最后操作人。
{
traceEntity.LastUpdateTime = DateTime.Now;
traceEntity.LastUpdateOperator = operater.Name;
}
if (traceEntity.LastUpdateTime == default(DateTime))
traceEntity.LastUpdateTime = DateTime.Now;
if (!string.IsNullOrEmpty(traceEntity.LastUpdateOperator) && traceEntity.LastUpdateOperator.Length > 50)
traceEntity.LastUpdateOperator = traceEntity.LastUpdateOperator.CutString(45);
}
}
#endregion
public void Dispose()
{
this.Connection.Dispose();
this.DbContext.Dispose();
}
}
3、mysql和mssql继承继承操作类
public class MSsqlDbContext : EFDbContext
{
static MSsqlDbContext()
{
Database.SetInitializer<MSsqlDbContext>(null);
}
public MSsqlDbContext()
: base("SqlServerContext")
{
}
public MSsqlDbContext(string connstr)
: base(connstr)
{ }
public MSsqlDbContext(DbConnection existingConnection)
: base(existingConnection)
{
}
}
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MysqlDbContext :EFDbContext
{
static MysqlDbContext()
{
Database.SetInitializer<MysqlDbContext>(null);
}
public MysqlDbContext()
:base("name=MySqlContext")
{
}
public MysqlDbContext(string connstr)
: base(connstr)
{ }
public MysqlDbContext(DbConnection existingConnection)
: base(existingConnection)
{
}
}
4、具体实体仓储
public class UserRepository : BaseRepository<User,int>, IUserRepository
{
}
5、使用
{
for (int i = 0; i < 10; i++)
{
db.Insert(new User()
{
Account = "000" + i,
Password = "1000" + i,
Name = "000" + i,
Sex = 0,
BizCode = "",
TypeId = -1,
TypeName = ""
});
}
var users2 = db.GetList(p=>p.Id>2);
db.Update(p => p.Id >= 2, u => new User() { TypeName = "1234" });
db.Delete(p => p.Id > 9);
}