您现在的位置: 育人网 > 考试信息中心 > IT 知识库 > .net开发 >
  • 即时新闻
  • 24小时顶榜
  • 24小时踩榜
  • 使用EF时写的基类(Repository)
  • 2010-7-30 来自:育人学习论坛 bbs.eduman.com.cn  标签:
    • 使用EF时写的基类(Repository)
    • 0 我顶
    • 0 我踩
  • 最近在学习和使用Entity Framework,同样,在业务层的开发中会把经常使用的方法写在基类中。在这里把写好的基类发表出来,目的是为了共同学习,因为使用EF时有很多问题还是不太理解,一是自己能力不足,二是EF还存在很多问题吧。代码如下,欢迎指出其中问题,真诚感谢!

    Repository
        public class Repository<TEntity> where TEntity : class
        {
            
    #region objectContext
            
            
    /// 
            
    /// 获得提供用于查询和使用对象形式的实体数据功能
             
    /// 

            
    /// 
            public virtual ObjectContext GetObjectContext()
            {
                
    return new OAEntities(); 
            }

            
    #endregion

            
    #region Find 条件表达式查询
            
    /// 
            
    /// 所有数据的查询列表
            
    /// 

            
    /// 
            public IQueryable<TEntity> FindAll()
            {
                
    return GetObjectContext().CreateObjectSet<TEntity>().AsQueryable();
            }

            
    /// 
            
    /// 根据指定条件表达式得到数据查询列表
            
    /// 

            
    /// 条件表达式
            
    /// 
            public IQueryable<TEntity> FindAll(Expression<Func<TEntity, bool>> exp)
            {
                
    return GetObjectContext().CreateObjectSet<TEntity>().Where(exp);
            }

            
    /// 
            
    /// 根据指定条件表达式得到数据实体
            
    /// 

            
    /// 条件表达式
            
    /// 
            public TEntity Find(Expression<Func<TEntity, bool>> exp)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    return objectContext.CreateObjectSet<TEntity>().FirstOrDefault(exp);
                }

            }
            
    #endregion

            
    #region GetQuery ESQL查询
            
    /// 
            
    /// ESQL查询
            
    /// 

            
    /// ESQL语句
            
    /// 参数(可选)
            
    /// 
            public ObjectQuery<TEntity> GetQuery(string query, params ObjectParameter[] parameter)
            {
                
    return GetObjectContext().CreateQuery<TEntity>(query, parameter);
            }

            
    /// 
            
    /// ESQL查询列表
            
    /// 

            
    /// ESQL语句
            
    /// 参数(可选)
            
    /// 
            public IList<TEntity> GetByQuery(string query, params ObjectParameter[] parameter)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    return objectContext.CreateQuery<TEntity>(query, parameter).ToList();
                }
            }
            
    #endregion

            
    #region GetList 返回IList列表
            
    /// 
            
    /// 所有数据列表
            
    /// 

            
    /// 
            public IList<TEntity> GetAll()
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    return objectContext.CreateObjectSet<TEntity>().AsQueryable().ToList();
                }
            }

            
    /// 
            
    /// 根据指定表达式得到数据列表
            
    /// 

            
    /// 
            public IList<TEntity> GetAll(Expression<Func<TEntity, bool>> exp)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    return objectContext.CreateObjectSet<TEntity>().Where(exp).ToList();
                }
            }

            
    #endregion

            
    #region Add 添加实体数据
            
    /// 
            
    /// 添加实体数据
            
    /// 

            
    /// 实体
            public int Add(TEntity entity)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    objectContext.CreateObjectSet
    <TEntity>().AddObject(entity);
                    
    return objectContext.SaveChanges();
                }

            }

            
    /// 
            
    /// 批量添加实体数据
            
    /// 

            
    /// 实体列表
            public int AddAll(IEnumerable<TEntity> entitys)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    foreach (var entity in entitys)
                    {
                        objectContext.CreateObjectSet
    <TEntity>().AddObject(entity);
                    }
                    
    return objectContext.SaveChanges();
                }
            }
            
    #endregion

            
    #region Delete 删除实体数据
            
    /// 
            
    /// 删除实体数据
            
    /// 

            
    /// 实体
            public int Delete(TEntity entity)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    objectContext.CreateObjectSet
    <TEntity>().DeleteObject(entity);
                    
    return objectContext.SaveChanges();
                }
            }

            
    /// 
            
    /// 批量删除实体数据
            
    /// 

            
    /// 实体列表
            public int DeleteAll(IEnumerable<TEntity> entitys)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    foreach (var entity in entitys)
                    {
                        objectContext.CreateObjectSet
    <TEntity>().DeleteObject(entity);
                    }
                    
    return objectContext.SaveChanges();
                }
            }
            
    #endregion

            
    #region Save 保存实体
            
    /// 
            
    /// 保存指定的实体变动
            
    /// 
            
            
    /// 实体列表
            
    /// 
            public int Save(IEntityWithKey entity)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    objectContext.Attach(entity);
                    objectContext.SetAllModified(entity);
                    
    return objectContext.SaveChanges();
                }
            }
            
    #endregion

            
    #region ExecuteforStore 直接执行数据源语句,如SQL
            
    /// 
            
    /// 执行数据源语句(如SQL),返回影响的行数
            
    /// 

            
    /// 查询语句
            
    /// 参数(可选)
            
    /// 
            public int ExecuteStoreCommand(string commandText, params ObjectParameter[] paramete)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    if (string.IsNullOrEmpty(commandText))
                    {
                        
    return 0;
                    }
                    
    return objectContext.ExecuteStoreCommand(commandText, paramete);
                }
            }

            
    /// 
            
    /// 执行数据源查询语句(如SQL),获得数据查询列表
            
    /// 

            
    /// 查询语句
            
    /// 参数(可选)
            
    /// 
            public ObjectResult<TEntity> ExecuteStoreQuery(string commandText, params ObjectParameter[] paramete)
            {
                
    return GetObjectContext().ExecuteStoreQuery<TEntity>(commandText, paramete);
            }

            
    /// 
            
    /// 执行数据源的函数或存储过程,返回影响的行数
            
    /// 

            
    /// 函数或存储过程
            
    /// 参数(可选)
            
    /// 
            public int ExecuteFunction(string functionName, params ObjectParameter[] paramete)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    if (string.IsNullOrEmpty(functionName))
                    {
                        
    return 0;
                    }
                    
    return objectContext.ExecuteFunction(functionName, paramete);
                }
            }

            
    /// 
            
    /// 执行数据源的查询函数或存储过程,获得数据查询列表
            
    /// 

            
    /// 函数或存储过程
            
    /// 参数(可选)
            
    /// 
            public ObjectResult<TEntity> ExecuteFunctionQuery(string functionName, params ObjectParameter[] paramete)
            {
                
    return GetObjectContext().ExecuteFunction<TEntity>(functionName, paramete);
            }

            
    /// 
            
    /// 执行数据源语句(如SQL),获得得数据列表
            
    /// 

            
    /// 查询语句
            
    /// 参数(可选)
            
    /// 
            public IList<TEntity> GetByStoreQuery(string commandText, params ObjectParameter[] paramete)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    return objectContext.ExecuteStoreQuery<TEntity>(commandText, paramete).ToList();
                }
            }
            
    /// 
            
    /// 执行数据源的查询函数或存储过程,获得数据列表
            
    /// 

            
    /// 函数或存储过程
            
    /// 参数(可选)
            
    /// 
            public IList<TEntity> GetByFunction(string functionName, params ObjectParameter[] paramete)
            {
                
    return GetObjectContext().ExecuteFunction<TEntity>(functionName, paramete).ToList();
            }
            
    #endregion

            
    #region ByID 对主键相关操作,如果主键名字不为ID是需要重写
            
    /// 
            
    /// 获得指定ID的实体
            
    /// 

            
    /// ID值
            
    /// 
            public virtual TEntity GetByID(object id)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    EntityKey ek 
    = new EntityKey(objectContext.DefaultContainerName + "." + typeof(TEntity).Name, "ID", id);
                    
    object entity = null;
                    objectContext.TryGetObjectByKey(ek, 
    out entity);
                    
    return (entity as TEntity);

                    
    //string query = "select value it from [" + typeof(TEntity).Name + "] as it where it.ID=@id";
                    
    //ObjectParameter p1 = new ObjectParameter("id", id);
                    
    //return objectContext.CreateQuery(query, p1).FirstOrDefault();
                }
            }

            
    /// 
            
    /// 获得指定ID的实体列表
            
    /// 

            
    /// 用逗号(,)分开ID
            
    /// 
            public virtual IList<TEntity> GetByIDs(string ids)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    
    string query = "select value it from [" + typeof(TEntity).Name + "] as it where it.ID in {" + ids + "}";
                    
    return objectContext.CreateQuery<TEntity>(query).ToList();
                }
            }

            
    /// 
            
    /// 删除指定ID的实体。
            
    /// 注意:此处直接执行数据源语句
            
    /// 

            
    /// 用逗号(,)分开ID
            
    /// 
            public virtual int DeleteByIDs(string ids)
            {
                
    if (string.IsNullOrEmpty(ids))
                {
                    
    return 0;
                }
                
    string sql = "delete [" + typeof(TEntity).Name + "] where ID in(" + ids + ")";
                
    return ExecuteStoreCommand(sql);
                
    //return DeleteAll(GetByIDs(ids));
            }

            
    /// 
            
    /// 删除指定ID组的实体
            
    /// 

            
    /// 多个ID数组
            
    /// 
            public virtual int DeleteByIDs(object[] ids)
            {
                
    string strIDs = string.Empty;
                
    foreach (int id in ids)
                {
                    strIDs 
    += "," + id.ToString();
                }
                
    if (strIDs.Length > 1)
                {
                    strIDs 
    = strIDs.Substring(1);
                }
                
    return DeleteByIDs(strIDs);
            }        
            
    #endregion
        }

    这里对需要对ObjectContext扩展一个方法:

    ObjectContextExtension
        /// 
        
    /// ObjectContext扩展
        
    /// 

        public static class ObjectContextExtension
        {
            
    /// 
            
    /// 把所有属性都标为已修改
            
    /// 

            
    /// 
            
    /// 
            public static void SetAllModified(this ObjectContext objectContext, IEntityWithKey item)
            {
                ObjectStateEntry stateEntry 
    = objectContext.ObjectStateManager.GetObjectStateEntry(item) as ObjectStateEntry;
                IEnumerable propertyNameList 
    = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(pn => pn.FieldType.Name);
                
    foreach (string propName in propertyNameList)
                {
                    stateEntry.SetModifiedProperty(propName);
                }
                stateEntry.SetModified();
            }
        }

    当实体主键不为ID时需要重写后面四个ByID方法,如:

    RightsService
        public class RightsService : Repository<Rights>
        {
            
    #region 重写基类方法
            
    /// 
            
    /// 权限编号对应的实体
            
    /// 

            public override Rights GetByID(object rightNo)
            {
                
    using (ObjectContext objectContext = GetObjectContext())
                {
                    System.Data.EntityKey ek 
    = new System.Data.EntityKey(objectContext.DefaultContainerName + ".Rights""RightNO", rightNo);
                    
    object entity = null;
                    objectContext.TryGetObjectByKey(ek, 
    out entity);
                    
    return (entity as Rights);
                }
            }

            
    /// 
            
    /// 获得指定ID的实体列表
            
    /// 

            
    /// 用逗号(,)分开ID
            
    /// 
            public override IList<Rights> GetByIDs(string ids)
            {
                ids 
    = "'" + ids.Replace(",""','"+ "'";
                
    string query = "select value it from [Rights] as it where it.RightNO in {" + ids + "}";
                
    return GetQuery(query).ToList();
            }

            
    /// 
            
    /// 删除指定ID的实体
            
    /// 

            
    /// 用逗号(,)分开ID
            
    /// 
            public override int DeleteByIDs(string ids)
            {
                ids 
    = "'" + ids.Replace(",""','"+ "'";
                
    string sql = "delete [Rights] where RightNO in(" + ids + ")";
                
    return ExecuteStoreCommand(sql);
            }  
            
    #endregion 
        }

    这里存在不少问题:

    1. 当返回查询时,怎么销毁ObjectContext?

    2. 使用全局的ObjectContext还是在每个方法都用using来new一个ObjectContext并销毁?

    3. 怎样把GetByID\GetByIDs\DeleteByIDs写得通用,不再是定死为ID,而是动态使用实体的EntityKey?

    4. ESQL支持update、delete语句吗?

    5. ......