zoukankan      html  css  js  c++  java
  • 项目使用Entity Framework用到的公共操作方法基类(Repository)及其使用 (转载)

    转自:http://www.cnblogs.com/jelea/archive/2013/01/06/2848309.html

    在项目中会有很多常用的操作方法如添加、删除、修改等,而在使用EF时虽然已是ORM,但仍然会习惯性的在业务层写大量类似方法,为此,分享一个我在项目使用的公共基类,经过多次修改,已在mssql和oracle数据库项目上使用没问题。希望对使用EF开发项目的朋友有帮助,不是说写的有多好,只是为了分享,因为我在使用EF之初也一直在找这样一个类但资源很少。 欢迎拍砖,不要伤人就行。。。

    以下是 Repository.cs源码 :

    Repository.cs
    复制代码
      1 using System.Collections.Generic;
      2 using System.Linq;
      3 using System.Linq.Expressions;
      4 using System.Data.Objects;
      5 using System.Data.Common;
      6 using System.Transactions;
      7 
      8 namespace System.Data.Entity
      9 {
     10     public class Repository<TEntity> : IDisposable where TEntity : class
     11     {
     12         #region 私有属性
     13         private ObjectContext objectContext;
     14         private string entitySetName;
     15         private string keyProperty = "ID";
     16         private string keyPropertyType = "Int32";
     17         #endregion
     18 
     19         #region 公共属性
     20         /// <summary>
     21         /// 获得提供用于查询和使用对象形式的实体数据功能
     22         /// </summary>
     23         protected ObjectContext ObjContext
     24         {
     25             get
     26             {
     27                 if (this.objectContext == null)
     28                 {
     29                     throw new Exception("数据库对象为空");
     30                 }
     31                 if (this.objectContext.Connection.State == System.Data.ConnectionState.Closed)
     32                 {
     33                     this.objectContext.Connection.Open(); //如果关闭则打开
     34                 }
     35                 return this.objectContext;
     36             }
     37             set
     38             {
     39                 this.objectContext = value;
     40                 objectContext.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly);
     41             }
     42         }
     43         /// <summary>
     44         /// 实体名字
     45         /// </summary>
     46         public string EntitySetName
     47         {
     48             get { return this.entitySetName; }
     49         }
     50         /// <summary>
     51         /// 主键字段名
     52         /// </summary>
     53         public string KeyProperty
     54         {
     55             get { return this.keyProperty; }
     56         }
     57         /// <summary>
     58         /// 主键字段类型
     59         /// </summary>
     60         public string KeyPropertyType
     61         {
     62             get { return this.keyPropertyType; }
     63         }
     64         #endregion
     65 
     66         #region objectContext
     67         /// <summary>
     68         /// 
     69         /// </summary>
     70         public Repository()
     71             : this(null)
     72         {
     73         }
     74         /// <summary>
     75         /// 用指定上下文构造新的实例
     76         /// </summary>
     77         /// <param name="objectContext">特定的上下文实例</param>
     78         public Repository(ObjectContext objectContext)
     79         {
     80             if (objectContext != null) //也可以构造后再指定数据库
     81             {
     82                 this.objectContext = objectContext; //指定数据库
     83             }
     84 
     85             Type entityType = typeof(TEntity);
     86             //表名
     87             this.entitySetName = entityType.Name;
     88             //主键
     89             foreach (var prop in entityType.GetProperties())
     90             {
     91                 var attr = prop.GetCustomAttributes(typeof(System.Data.Objects.DataClasses.EdmScalarPropertyAttribute), false).FirstOrDefault() as System.Data.Objects.DataClasses.EdmScalarPropertyAttribute;
     92                 if (attr != null && attr.EntityKeyProperty)
     93                 {
     94                     this.keyProperty = prop.Name;
     95                     this.keyPropertyType = prop.PropertyType.Name;
     96                     break;
     97                 }
     98             }
     99 
    100             if (objectContext != null)
    101             {
    102                 objectContext.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly);
    103             }
    104         }
    105         /// <summary>
    106         /// 释放对象上下文使用的资源
    107         /// </summary>
    108         public void Dispose()
    109         {
    110             CloseObjectContext();
    111         }
    112         /// <summary>
    113         /// 释放ObjectContext连接
    114         /// </summary>
    115         public void CloseObjectContext()
    116         {
    117             if (objectContext != null )
    118             {
    119                 if (objectContext.Connection.State == ConnectionState.Open)
    120                 {
    121                     objectContext.Connection.Close();
    122                 }
    123                 objectContext.Dispose();
    124             }
    125         }
    126         #endregion
    127 
    128         #region Find 条件表达式查询
    129         /// <summary>
    130         /// 所有数据的查询列表
    131         /// </summary>
    132         /// <returns></returns>
    133         public IQueryable<TEntity> FindAll()
    134         {
    135             return objectContext.CreateObjectSet<TEntity>().AsQueryable();
    136         }
    137 
    138         /// <summary>
    139         /// 根据指定条件表达式得到数据查询列表
    140         /// </summary>
    141         /// <param name="exp">条件表达式</param>
    142         /// <returns></returns>
    143         public IQueryable<TEntity> FindAll(Expression<Func<TEntity, bool>> exp)
    144         {
    145             return objectContext.CreateObjectSet<TEntity>().Where(exp);
    146         }
    147 
    148         /// <summary>
    149         /// 根据指定条件表达式得到数据实体
    150         /// </summary>
    151         /// <param name="exp">条件表达式</param>
    152         /// <returns></returns>
    153         public TEntity Find(Expression<Func<TEntity, bool>> exp)
    154         {
    155             return objectContext.CreateObjectSet<TEntity>().FirstOrDefault(exp);
    156         }
    157         #endregion
    158 
    159         #region GetQuery ESQL查询
    160         /// <summary>
    161         /// ESQL查询
    162         /// </summary>
    163         /// <param name="query">ESQL语句</param>
    164         /// <param name="parameter">参数(可选)</param>
    165         /// <returns></returns>
    166         ///  <remarks>可用.Execute(MergeOption.AppendOnly)执行查询</remarks>
    167         public ObjectQuery<TEntity> GetQuery(string query, params ObjectParameter[] parameter)
    168         {
    169             return objectContext.CreateQuery<TEntity>(query, parameter);
    170         }
    171 
    172         /// <summary>
    173         /// ESQL查询列表
    174         /// </summary>
    175         /// <param name="query">ESQL语句</param>
    176         /// <param name="parameter">参数(可选)</param>
    177         /// <returns></returns>
    178         ///  <remarks>可用.Execute(MergeOption.AppendOnly)执行查询</remarks>
    179         public List<TEntity> GetListByQuery(string query, params ObjectParameter[] parameter)
    180         {
    181             return objectContext.CreateQuery<TEntity>(query, parameter).ToList();
    182         }
    183         /// <summary>
    184         /// ESQL查询
    185         /// </summary>
    186         /// <param name="query">ESQL语句</param>
    187         /// <param name="parameter">参数(可选)</param>
    188         /// <returns></returns>
    189         /// <remarks>可用.Execute(MergeOption.AppendOnly)执行查询</remarks>
    190         public ObjectQuery<Object> GetObjectQuery(string query, params ObjectParameter[] parameter)
    191         {
    192             return objectContext.CreateQuery<Object>(query, parameter);
    193         }
    194         /// <summary>
    195         /// ESQL查询,返回单值Object
    196         /// </summary>
    197         /// <param name="query">ESQL语句</param>
    198         /// <param name="parameter">参数(可选)</param>
    199         /// <returns></returns>
    200         /// <remarks>用.Execute(MergeOption.AppendOnly)查询</remarks>
    201         public Object GetObjectByQuery(string query, params ObjectParameter[] parameter)
    202         {
    203             return GetObjectQuery(query, parameter).Execute(MergeOption.AppendOnly).FirstOrDefault();
    204         }
    205         #endregion
    206 
    207         #region GetList 返回List列表
    208         /// <summary>
    209         /// 所有数据列表
    210         /// </summary>
    211         /// <returns></returns>
    212         public List<TEntity> GetList()
    213         {
    214             return objectContext.CreateObjectSet<TEntity>().AsQueryable().ToList();
    215         }
    216 
    217         /// <summary>
    218         /// 根据指定表达式得到数据列表
    219         /// </summary>
    220         /// <returns></returns>
    221         public List<TEntity> GetList(Expression<Func<TEntity, bool>> exp)
    222         {
    223             return objectContext.CreateObjectSet<TEntity>().Where(exp).ToList();
    224         }
    225 
    226         #endregion
    227 
    228         #region Add 添加实体数据
    229         /// <summary>
    230         /// 添加实体数据
    231         /// </summary>
    232         /// <param name="entity">实体</param>
    233         public int Add(TEntity entity)
    234         {
    235             objectContext.CreateObjectSet<TEntity>().AddObject(entity);
    236             return objectContext.SaveChanges();
    237         }
    238         /// <summary>
    239         /// 添加实体数据
    240         /// </summary>
    241         /// <param name="entity">实体</param>
    242         /// <param name="options">SaveOptions:
    243         /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。
    244         /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。
    245         /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。
    246         /// </param>
    247         public int Add(TEntity entity, SaveOptions options)
    248         {
    249             objectContext.CreateObjectSet<TEntity>().AddObject(entity);
    250             return objectContext.SaveChanges(options);
    251         }
    252 
    253         /// <summary>
    254         /// 批量添加实体数据
    255         /// </summary>
    256         /// <param name="entitys">实体列表</param>
    257         public int AddAll(IEnumerable<TEntity> entitys)
    258         {
    259             foreach (var entity in entitys)
    260             {
    261                 objectContext.CreateObjectSet<TEntity>().AddObject(entity);
    262             }
    263             return objectContext.SaveChanges();
    264         }
    265         /// <summary>
    266         /// 批量添加实体数据
    267         /// </summary>
    268         /// <param name="entitys">实体列表</param>
    269         /// <param name="options">SaveOptions:
    270         /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。
    271         /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。
    272         /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。
    273         /// </param>
    274         public int AddAll(IEnumerable<TEntity> entitys, SaveOptions options)
    275         {
    276             var objSet = objectContext.CreateObjectSet<TEntity>();
    277             foreach (var entity in entitys)
    278             {
    279                 objSet.AddObject(entity);
    280             }
    281             return objectContext.SaveChanges(options);
    282         }
    283         #endregion
    284 
    285         #region Delete 删除实体数据
    286         /// <summary>
    287         /// 删除实体数据
    288         /// </summary>
    289         /// <param name="entity">实体</param>
    290         public int Delete(TEntity entity)
    291         {
    292             objectContext.CreateObjectSet<TEntity>().DeleteObject(entity);
    293             return objectContext.SaveChanges();
    294         }
    295 
    296         /// <summary>
    297         /// 批量删除实体数据
    298         /// </summary>
    299         /// <param name="entitys">实体列表</param>
    300         public int DeleteAll(IEnumerable<TEntity> entitys)
    301         {
    302             if (entitys != null && entitys.Count() > 0)
    303             {
    304                 foreach (var entity in entitys)
    305                 {
    306                     objectContext.CreateObjectSet<TEntity>().DeleteObject(entity);
    307                 }
    308                 return objectContext.SaveChanges();
    309             }
    310             return 0;
    311         }
    312         #endregion
    313 
    314         #region Save 保存实体
    315         /// <summary>
    316         /// 保存实体和变动
    317         /// </summary>        
    318         /// <returns></returns>
    319         public int Save()
    320         {
    321             return objectContext.SaveChanges();
    322         }
    323         /// <summary>
    324         /// 保存实体和变动
    325         /// </summary>    
    326         /// <param name="options">SaveOptions:
    327         /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。
    328         /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。
    329         /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。
    330         /// </param>
    331         public int Save(SaveOptions options)
    332         {
    333             return objectContext.SaveChanges(options);
    334         }
    335         /// <summary>
    336         /// 保存指定的实体变动
    337         /// </summary>        
    338         /// <param name="entity">实体列表</param>
    339         /// <returns></returns>
    340         public int Save(TEntity entity)
    341         {
    342             objectContext.AttachTo(this.entitySetName, entity);
    343             objectContext.SetAllModified(entity);
    344             return objectContext.SaveChanges();
    345         }
    346         /// <summary>
    347         /// 保存指定的实体变动
    348         /// </summary>        
    349         /// <param name="entity">实体列表</param>
    350         /// <param name="options">SaveOptions:
    351         /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。
    352         /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。
    353         /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。
    354         /// </param>
    355         public int Save(TEntity entity, SaveOptions options)
    356         {
    357             objectContext.AttachTo(this.entitySetName, entity);
    358             objectContext.SetAllModified(entity);
    359             return objectContext.SaveChanges(options);
    360         }
    361         #endregion
    362 
    363         /// <summary>
    364         /// 将对象或对象图附加到本实体集中的对象上下文。
    365         /// </summary>
    366         /// <param name="entity"> 要附加的 System.Object。</param>
    367         public void AttachTo(TEntity entity)
    368         {
    369             objectContext.AttachTo(this.entitySetName, entity);
    370         }
    371         /// <summary>
    372         /// 将对象或对象图附加到特定实体集中的对象上下文。
    373         /// </summary>
    374         /// <param name="entitySetName"> 表示实体集名称,可以选择通过实体容器名称对它进行限定。</param>
    375         /// <param name="entity"> 要附加的 System.Object。</param>
    376         public void AttachTo(string entitySetName, TEntity entity)
    377         {
    378             objectContext.AttachTo(entitySetName, entity);
    379         }
    380         /// <summary>
    381         /// 在对象具有实体键时将对象或对象图附加到对象上下文。
    382         /// </summary>
    383         /// <param name="entity">要附加的对象。</param>
    384         public void Attach(System.Data.Objects.DataClasses.IEntityWithKey entity)
    385         {
    386             objectContext.Attach(entity);
    387         }
    388         /// <summary>
    389         /// 从对象上下文移除对象。
    390         /// </summary>
    391         /// <param name="entity">要分离的对象。仅移除 entity;如果有任何相关对象受同一 System.Data.Objects.ObjectStateManager 跟踪,则不会自动分离这些对象。</param>
    392         public void Detach(object entity)
    393         {
    394             objectContext.Detach(entity);
    395         }
    396 
    397         #region ExecuteforStore 直接执行数据源语句,如MSSQL、Oracle
    398         /// <summary>
    399         /// 执行数据源语句(如MSSQL),返回影响的行数
    400         /// </summary>
    401         /// <param name="commandText">查询语句</param>
    402         /// <param name="parameter">参数(可选)</param>
    403         /// <returns></returns>
    404         public int ExecuteStoreCommand(string commandText, params ObjectParameter[] parameter)
    405         {
    406             if (string.IsNullOrEmpty(commandText))
    407             {
    408                 return 0;
    409             }
    410             return objectContext.ExecuteStoreCommand(commandText, parameter);
    411         }
    412 
    413         /// <summary>
    414         /// 执行数据源查询语句(如MSSQL),获得数据查询列表
    415         /// </summary>
    416         /// <param name="commandText">查询语句</param>
    417         /// <param name="parameter">参数(可选)</param>
    418         /// <returns></returns>
    419         public ObjectResult<TEntity> ExecuteStoreQuery(string commandText, params ObjectParameter[] parameter)
    420         {
    421             return objectContext.ExecuteStoreQuery<TEntity>(commandText, parameter);
    422         }
    423 
    424         /// <summary>
    425         /// 执行数据源的函数或存储过程,返回影响的行数
    426         /// </summary>
    427         /// <param name="functionName">函数或存储过程</param>
    428         /// <param name="parameter">参数(可选)</param>
    429         /// <returns></returns>
    430         public int ExecuteFunction(string functionName, params ObjectParameter[] parameter)
    431         {
    432             if (string.IsNullOrEmpty(functionName))
    433             {
    434                 return 0;
    435             }
    436             return objectContext.ExecuteFunction(functionName, parameter);
    437         }
    438 
    439         /// <summary>
    440         /// 执行数据源的查询函数或存储过程,获得数据查询列表
    441         /// </summary>
    442         /// <param name="functionName">函数或存储过程</param>
    443         /// <param name="parameter">参数(可选)</param>
    444         /// <returns></returns>
    445         public ObjectResult<TEntity> ExecuteFunctionQuery(string functionName, params ObjectParameter[] parameter)
    446         {
    447             return objectContext.ExecuteFunction<TEntity>(functionName, parameter);
    448         }
    449 
    450         /// <summary>
    451         /// 执行数据源语句(如MSSQL),获得得数据列表
    452         /// </summary>
    453         /// <param name="commandText">查询语句</param>
    454         /// <param name="parameter">参数(可选)</param>
    455         /// <returns></returns>
    456         public List<TEntity> GetListByStoreQuery(string commandText, params ObjectParameter[] parameter)
    457         {
    458             return objectContext.ExecuteStoreQuery<TEntity>(commandText, parameter).ToList();
    459         }
    460         /// <summary>
    461         /// 执行数据源的查询函数或存储过程,获得数据列表
    462         /// </summary>
    463         /// <param name="functionName">函数或存储过程</param>
    464         /// <param name="parameter">参数(可选)</param>
    465         /// <returns></returns>
    466         public List<TEntity> GetListByFunction(string functionName, params ObjectParameter[] parameter)
    467         {
    468             return objectContext.ExecuteFunction<TEntity>(functionName, parameter).ToList();
    469         }
    470         #endregion
    471 
    472         #region ByID 对主键相关操作
    473         /// <summary>
    474         /// 获得指定主键的实体
    475         /// </summary>
    476         /// <param name="id">主键值</param>
    477         /// <returns></returns>
    478         public virtual TEntity GetByID(object id)
    479         {
    480             EntityKey ek = new EntityKey(objectContext.DefaultContainerName + "." + this.entitySetName, this.keyProperty, id);
    481             object entity = null;
    482             objectContext.TryGetObjectByKey(ek, out entity);
    483             return (entity as TEntity);
    484         }
    485 
    486         /// <summary>
    487         /// 获得指定主键的实体列表
    488         /// </summary>
    489         /// <param name="ids">用逗号(,)分隔的主键ID</param>
    490         /// <returns></returns>
    491         public virtual List<TEntity> GetListByIDs(string ids)
    492         {
    493             ids = SqlFilter(ids);
    494             if ("string".Equals(this.keyPropertyType, StringComparison.OrdinalIgnoreCase))
    495             {
    496                 ids = "'" + ids.Replace(",", "','") + "'";
    497             }
    498             string query = "select value it from " + this.entitySetName + " as it where it." + this.keyProperty + " in {" + ids + "}";
    499             return objectContext.CreateQuery<TEntity>(query).ToList();
    500         }
    501         /// <summary>
    502         /// 获得指定主键的实体列表
    503         /// </summary>
    504         /// <param name="ids">主键ID列表</param>
    505         /// <returns></returns>
    506         public virtual List<TEntity> GetListByIDs(IEnumerable<object> ids)
    507         {
    508             string strIDs = string.Empty;
    509             foreach (int id in ids)
    510             {
    511                 strIDs += "," + id.ToString();
    512             }
    513             if (strIDs.Length > 1)
    514             {
    515                 strIDs = strIDs.Substring(1);
    516             }
    517             return GetListByIDs(strIDs);
    518         }
    519 
    520         /// <summary>
    521         /// 删除指定ID的实体。
    522         /// 注意:此处直接执行数据源语句
    523         /// </summary>
    524         /// <param name="ids">用逗号(,)分隔的主键ID</param>
    525         /// <returns></returns>
    526         public virtual int DeleteByIDs(string ids)
    527         {
    528             if (string.IsNullOrEmpty(ids))
    529             {
    530                 return 0;
    531             }
    532             ids = SqlFilter(ids);
    533             if ("string".Equals(this.keyPropertyType, StringComparison.OrdinalIgnoreCase))
    534             {
    535                 ids = "'" + ids.Replace(",", "','") + "'";
    536             }
    537             string sql = string.Format("delete {0}  where {1} in({2})", this.entitySetName, this.keyProperty, ids);
    538             return ExecuteStoreCommand(sql);
    539         }
    540 
    541         /// <summary>
    542         /// 删除指定ID组的实体
    543         /// </summary>
    544         /// <param name="ids">主键ID列表</param>
    545         /// <returns></returns>
    546         public virtual int DeleteByIDs(IEnumerable<object> ids)
    547         {
    548             string strIDs = string.Empty;
    549             foreach (int id in ids)
    550             {
    551                 strIDs += "," + id.ToString();
    552             }
    553             if (strIDs.Length > 1)
    554             {
    555                 strIDs = strIDs.Substring(1);
    556             }
    557             return DeleteByIDs(strIDs);
    558         }
    559         #endregion
    560 
    561         #region 事务
    562         /// <summary>
    563         /// TransactionScope事务处理。
    564         /// TransactionScopeOption 默认值为 Required。
    565         /// 用 .Complete() 提交事务
    566         /// </summary>
    567         /// <returns>返回 TransactionScope</returns>        
    568         public TransactionScope GetTransactionScope()
    569         {
    570             return (new TransactionScope(TransactionScopeOption.Required));
    571         }
    572         /// <summary>
    573         /// TransactionScope事务处理。
    574         /// 用 .Complete() 提交事务
    575         /// </summary>
    576         /// <param name="scopeOption">提供用于创建事务范围的附加选项:
    577         /// Required:该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。 
    578         /// RequiresNew:总是为该范围创建新事务。 
    579         /// Suppress:环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。 
    580         /// </param>
    581         /// <returns>返回 TransactionScope</returns>
    582         public TransactionScope GetTransactionScope(TransactionScopeOption scopeOption)
    583         {
    584             return (new TransactionScope(scopeOption));
    585         }
    586         /// <summary>
    587         /// TransactionScope事务处理。
    588         /// 用 .Complete() 提交事务
    589         /// </summary>
    590         /// <param name="scopeOption">提供用于创建事务范围的附加选项:
    591         /// Required:该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。 
    592         /// RequiresNew:总是为该范围创建新事务。 
    593         /// Suppress:环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。 
    594         /// </param>
    595         /// <param name="scopeTimeout">在它之后,事务范围将超时并中止此事务。</param>
    596         /// <returns>返回 TransactionScope</returns> 
    597         public TransactionScope GetTransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout)
    598         {
    599             return (new TransactionScope(scopeOption, scopeTimeout));
    600         }
    601 
    602         /// <summary>
    603         /// TransactionScope事务处理。
    604         /// 用 .Complete() 提交事务
    605         /// </summary>
    606         /// <param name="transactionToUse">要设置为环境事务(以便该范围中进行的事务性工作使用此事务)的事务。</param>
    607         /// <returns>返回 TransactionScope</returns> 
    608         public TransactionScope GetTransactionScope(Transaction transactionToUse)
    609         {
    610             return (new TransactionScope(transactionToUse));
    611         }
    612         /// <summary>
    613         /// TransactionScope事务处理。
    614         /// 用 .Complete() 提交事务
    615         /// </summary>
    616         /// <param name="transactionToUse">要设置为环境事务(以便该范围中进行的事务性工作使用此事务)的事务。</param>
    617         /// <param name="scopeTimeout">在它之后,事务范围将超时并中止此事务。</param>
    618         /// <returns>返回 TransactionScope</returns> 
    619         public TransactionScope GetTransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout)
    620         {
    621             return (new TransactionScope(transactionToUse, scopeTimeout));
    622         }
    623 
    624         /// <summary>
    625         /// TransactionScope事务处理。
    626         /// 用 .Complete() 提交事务
    627         /// </summary>
    628         /// <param name="scopeOption">提供用于创建事务范围的附加选项:
    629         /// Required:该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。 
    630         /// RequiresNew:总是为该范围创建新事务。 
    631         /// Suppress:环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。 
    632         /// </param>
    633         /// <param name="transactionOptions">包含指定事务行为的附加信息。</param>
    634         /// <returns>返回 TransactionScope</returns> 
    635         public TransactionScope GetTransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions)
    636         {
    637             return (new TransactionScope(scopeOption, transactionOptions));
    638         }        
    639 
    640         #endregion
    641 
    642         #region 辅助方法
    643         /// <summary>
    644         /// sql注入过滤
    645         /// </summary>
    646         /// <param name="sqlString"></param>
    647         /// <returns></returns>
    648         public string SqlFilter(string sqlString)
    649         {
    650             return sqlString
    651                 .Replace("'", "''");
    652         }
    653         #endregion
    654     }
    655 
    656 }
    复制代码

    ObjectContext扩展类ObjectContextExtension.cs

    ObjectContextExtension.cs
     1 using System.Linq;
     2 using System.Data.Objects;
     3 using System.Collections;
     4 
     5 namespace System.Data.Objects
     6 {
     7     /// <summary>
     8     /// ObjectContext扩展
     9     /// </summary>
    10     public static class ObjectContextExtension
    11     {
    12         /// <summary>
    13         /// 把所有属性都标为已修改
    14         /// </summary>
    15         /// <param name="objectContext"></param>
    16         /// <param name="item"></param>
    17         public static void SetAllModified(this ObjectContext objectContext, object item)
    18         {
    19             ObjectStateEntry stateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(item) as ObjectStateEntry;
    20             IEnumerable propertyNameList = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(pn => pn.FieldType.Name);
    21             foreach (string propName in propertyNameList)
    22             {
    23                 stateEntry.SetModifiedProperty(propName);
    24             }
    25             stateEntry.SetModified();
    26         }
    27     }
    28 }

    使用上可以用以下结构:
    1. 建一个base业务类,代码如下:

    BaseService.cs
     1 public class BaseService<TEntity> : Repository<TEntity> where TEntity : System.Data.Objects.DataClasses.EntityObject //或用class       
     2     {
     3         public BaseService()
     4             : base(new OA.Data.OAEntities())//默认数据库
     5         {
     6         }
     7         public BaseService(System.Data.Objects.ObjectContext objContext)
     8             : base(objContext)
     9         {
    10         }
    11         /// <summary>
    12         /// 为其它Service指定与本Service相同的ObjContext数据对象
    13         /// </summary>
    14         /// <param name="newService">目标Service</param>
    15         protected dynamic SameObjContext(dynamic service)
    16         {
    17             service.ObjContext = this.ObjContext;
    18             return service;
    19         }
    20     }

    2.业务层的每个业务类都继承BaseService,如针对Department的业务层DepartmentService.cs代码:

    DepartmentService.cs
    1 public class DepartmentService : BaseService<Department>
    2 {
    3 }


    (完)

  • 相关阅读:
    插件集合
    postgis_LayerTransform
    react-高阶组件
    react-自定义事件
    Immutable 详解及 React 中实践
    babel-preset-env: a preset that configures Babel for you
    彻底解决Webpack打包慢的问题
    打包图片
    drag
    brush
  • 原文地址:https://www.cnblogs.com/zcm123/p/2918398.html
Copyright © 2011-2022 走看看