using iWareCommon.Common.Dao;
using iWareCommon.Common.Entity;
using iWareCommon.Common.EnumType;
using iWareCommon.Properties;
using iWareCommon.Utils;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Linq;
namespace iWareCommon.Common.Service
{
///
/// 公用方法的抽象类
/// 张展
///
/// 自定义的实体类
/// ORM中的实体类
public abstract class CommonService:IService where T : class, ICommonEntity where S : class where D: DbContext,IDisposable
{
#region 需要在子类中实现的抽象方法
private CommonDao CommonDao;
public CommonService(CommonDao commonDao)
{
this.CommonDao = commonDao;
}
#endregion
#region 根据条件查询
///
/// 根据条件查询自定义实体T的列表
///
/// 查询条件
/// 错误信息
/// 自定义实体T的记录列表
public virtual List QueryByParam(QueryParam param, out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.QueryByParam(param, dbModel);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "QueryByParam", msg);
return new List();
}
catch (Exception ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "QueryByParam", ex.Message);
return new List();
}
}
}
#endregion
#region 根据条件分页查询
///
/// 根据条件分页查询自定义实体T的列表,同时返回记录的总条数及当前所在的页数
///
/// 查询条件
/// 异常错误消息
/// 记录的总条数
/// 当前页面数
/// 自定义实体T的记录列表
public virtual List QueryByParam(QueryParam param, out string msg, out int totalNum, out int currentPage)
{
msg = "";
totalNum = 0;
currentPage = 1;
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.QueryByParam(param, dbModel, out totalNum, out currentPage);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "QueryByParam", msg);
return new List();
}
catch (Exception ex)
{
msg = ex.Message;
totalNum = 0;
currentPage = 1;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "QueryByParam", ex.Message);
return new List();
}
}
}
#endregion
#region 插入新的对象
///
/// 将自定义的实体T的实例列表批量保存到数据库
///
/// 自定义类型T的实例列表
/// 异常错误消息
/// 保存的数量
public virtual int Save(List ts, out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.Save(ts, dbModel);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Save", msg);
return 0;
}
catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Save", ex.Message);
return 0;
}
catch (Exception ex)
{
msg = ex.HResult == (int)EDbError.记录已存在 ? EDbError.记录已存在.ToString() : ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Save", msg);
return 0;
}
}
}
///
/// 将自定义的实体T的实例保存到数据库
///
/// 自定义类型T的实例
/// 异常错误消息
/// 新添加T对象的id
public virtual int Save(T t, out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.Save(t, dbModel);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Save", msg);
return -1;
}
catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Save", ex.Message);
return -1;
}
catch (Exception ex)
{
msg = ex.HResult == (int)EDbError.记录已存在 ? EDbError.记录已存在.ToString() : ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Save", msg);
return -1;
}
}
}
#endregion
#region 修改对象
///
/// 修改自定义类型T的实体并保存到数据库
///
/// 自定义类型T的实例
/// 异常错误消息
/// 需改实体的id
public virtual int Update(T t, out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.Update(t, dbModel);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Update", msg);
return -1;
}
catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "SaveUpdate", ex.Message);
return -1;
}
catch (Exception ex)
{
msg = ex.HResult == (int)EDbError.记录已存在 ? EDbError.记录已存在.ToString() : ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Update", msg);
return -1;
}
}
}
///
/// 修改自定义类型T的实体并保存到数据库
///
/// 自定义类型T的实例
/// 异常错误消息
/// 需改实体的id
public virtual int Update(List ts, out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
CommonDao.Update(ts, dbModel);
return ts.Count;
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Update", msg);
return -1;
}
catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "SaveUpdate", ex.Message);
return -1;
}
catch (Exception ex)
{
msg = ex.HResult == (int)EDbError.记录已存在 ? EDbError.记录已存在.ToString() : ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Update", msg);
return -1;
}
}
}
#endregion
#region 删除对象
///
/// 从数据库中删除主键为id的记录
///
/// 需要删除对象的id
/// 异常错误信息
/// 被删除对象的主键
public virtual int Delete(int id, out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.Delete(id, dbModel);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Delete", msg);
return -1;
}
catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Delete", ex.Message);
return -1;
}
catch (Exception ex)
{
msg = "记录已被其他对象引用,不能删除";
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Delete", ex.Message);
return -1;
}
}
}
///
/// 从数据库中批量删除主键列表为ids的记录
///
/// 需要删除对象的id列表
/// 异常错误信息
/// 被删除对象的数量
public virtual int Delete(List ids, out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.Delete(ids, dbModel);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Delete", msg);
return 0;
}
catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Delete", ex.Message);
return 0;
}
catch (Exception ex)
{
msg = "记录已被其他对象引用,不能删除";
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Delete", ex.Message);
return 0;
}
}
}
#endregion
#region 拼装字典
///
/// 将满足条件的T类型拼装成以id为键,类型本身为值的字典
///
/// 查询条件
/// 异常错误消息
/// 以id为键,类型本身为值的字典
public virtual Dictionary ToDictionary(QueryParam param,out string msg)
{
msg = "";
var type = typeof(D);
using (var dbModel = type.Assembly.CreateInstance(type.FullName) as DbContext)
{
try
{
return CommonDao.ToDictionary(param, dbModel);
}
catch (DbEntityValidationException ex)
{
var errs = ex.EntityValidationErrors.SelectMany(validationResult => validationResult.ValidationErrors).Select(m => m.ErrorMessage);
msg = string.Join(", ", errs);
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "ToDictionary", msg);
return new Dictionary();
}
catch (Exception ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "ToDictionary", ex.Message);
return new Dictionary();
}
}
}
#endregion
}
}