zoukankan      html  css  js  c++  java
  • EntityFramework4.x/5.0数据库操作基础类

    本人之前一直写的都是Java的Dao和Manager不知.NET中的DAL是否也如下,若有不对,请各位园友们指出,谢谢~

    先放上接口

    public interface IDAL<PK, E>
            where PK : struct
            where E : class, new()
        {
            
            int Save(E entity);
            int Update(E entity);
            int Update(E entity, string[] propertys);
            int Delete(E entity);
            int Delete(PK id);
            IList<E> GetDatas();
            IList<E> GetDatas(Expression<Func<E, bool>> predicate);
            IList<T> GetDatas<T>(Expression<Func<E, bool>> predicate, Expression<Func<E, T>> selector);
            E GetById(PK id);
    
            int ExecuteRawCommand(string sql, params object[] parameters);
            IList<E> SqlQuery(string sql, params object[] parameters);
        }
    

      然后下面该类是基础操作类,实现了部分CRUD的操作,其余的操作,可以在具体实现类中完成

    public abstract class AbstractBaseDAL<PK, E> : IDAL<PK, E>
            where PK : struct
            where E : class, new()
        {
    
            public const string PK_ID = "Id";
    
            public Type GetEntityType()
            {
                return typeof(E);
            }
    
            
            /// <summary>
            /// 保存一条新的记录
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public int Save(E entity)
            {
                int changeCount = 0;
                using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required))
                {
                    using (YzOASysEntities context = new YzOASysEntities())
                    {
                        context.Set<E>().Add(entity);
                        changeCount = context.SaveChanges();
    
                        if (changeCount > 0)
                            transaction.Complete();
                    }
                }
                return changeCount;
            }
    
            /// <summary>
            /// 修改一个实体
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public int Update(E entity)
            {
                int changeCount = 0;
                using(TransactionScope transaction = new TransactionScope (TransactionScopeOption.Required))
                {
                    using (YzOASysEntities context = new YzOASysEntities())
                    {
                        context.Set<E>().Attach(entity);
                        
                        if (context.Entry<E>(entity).State == EntityState.Unchanged)
                            context.Entry<E>(entity).State = EntityState.Modified;
                        changeCount = context.SaveChanges();
                        if (changeCount > 0)
                            transaction.Complete();
                    }
                }
                return changeCount;
            }
    
            /// <summary>
            /// 修改一个实体,只修改传入的书包含有该属性名的字段
            /// </summary>
            /// <param name="entity"></param>
            /// <param name="propertys"></param>
            /// <returns></returns>
            public int Update(E entity, string[] propertys)
            {
                int changeCount = 0;
                using(TransactionScope transaction = new TransactionScope (TransactionScopeOption.Required))
                {
                    using (YzOASysEntities context = new YzOASysEntities())
                    {
                        context.Set<E>().Attach(entity);
                        
                        IObjectContextAdapter objectContextAdatper = context;
                        ObjectContext objectContext = objectContextAdatper.ObjectContext;
                        ObjectStateEntry ose = objectContext.ObjectStateManager.GetObjectStateEntry(entity);
                        foreach (string property in propertys)
                        {
                            ose.SetModifiedProperty(property);
                        }
    
                        if (context.Entry<E>(entity).State == EntityState.Unchanged)
                            context.Entry<E>(entity).State = EntityState.Modified;
                        changeCount = context.SaveChanges();
                        if (changeCount > 0)
                            transaction.Complete();
                    }
                }
                return changeCount;
                
            }
    
            /// <summary>
            /// 根据一个实体删除一个记录
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public int Delete(E entity)
            {
                int changeCount = 0;
                using(TransactionScope transaction = new TransactionScope (TransactionScopeOption.Required))
                {
                    using (YzOASysEntities context = new YzOASysEntities())
                    {
                        context.Set<E>().Attach(entity);
                        if (context.Entry<E>(entity).State == EntityState.Unchanged)
                            context.Entry<E>(entity).State = EntityState.Deleted;
                        context.Set<E>().Remove(entity);
                        try
                        {
                            changeCount = context.SaveChanges();
                        }
                        catch (DbUpdateConcurrencyException ex)
                        {
     
                        }
                        if (changeCount > 0)
                            transaction.Complete();
                    }
                }
                return changeCount;
            }
    
            /// <summary>
            /// 根据主键ID删除一个记录
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public int Delete(PK id)
            {
                int changeCount = 0;
                using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required))
                {
                    using (YzOASysEntities context = new YzOASysEntities())
                    {
                        E e = new E();
                        PropertyInfo pi =  e.GetType().GetProperty(PK_ID);
                        pi.SetValue(e, id, null);
                        context.Set<E>().Attach(e);
                        if (context.Entry<E>(e).State == EntityState.Unchanged)
                            context.Entry<E>(e).State = EntityState.Deleted;
                        context.Set<E>().Remove(e);
    
                        try
                        {
                            changeCount = context.SaveChanges();
                        }
                        catch (DbUpdateConcurrencyException ex)
                        {
                            
                        }
                        if (changeCount > 0)
                            transaction.Complete();
                    }
                }
                return changeCount;
            }
    
            /// <summary>
            /// 获取当前实体的所有集合数据
            /// </summary>
            /// <returns></returns>
            public IList<E> GetDatas()
            {
                using (YzOASysEntities context = new YzOASysEntities())
                {
                    return context.Set<E>().ToList();
                }
            }
    
            /// <summary>
            /// 根据linq条件查询实体集合数据
            /// </summary>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public IList<E> GetDatas(Expression<Func<E, bool>> predicate)
            {
                using (YzOASysEntities context = new YzOASysEntities())
                {
                    return context.Set<E>().Where(predicate).ToList();
                }
            }
    
            /// <summary>
            /// 根据linq条件查询并返回实体的指定字段的数据集合
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="predicate"></param>
            /// <param name="selector"></param>
            /// <returns></returns>
            public IList<T> GetDatas<T>(Expression<Func<E, bool>> predicate, Expression<Func<E, T>> selector)
            {
                using (YzOASysEntities context = new YzOASysEntities())
                {
                    return context.Set<E>().Where(predicate).Select(selector).ToList();
                }
            }
    
            /// <summary>
            /// 根据实体ID查找一条记录
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public E GetById(PK id)
            {
                using (YzOASysEntities context = new YzOASysEntities())
                {
                    return context.Set<E>().Find(id);
                }
            }
    
            /// <summary>
            /// 操作原生SQL
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public int ExecuteRawCommand(string sql, params object[] parameters)
            {
                using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required))
                {
                    using (YzOASysEntities context = new YzOASysEntities())
                    {
                        return context.Database.ExecuteSqlCommand(sql, parameters);
                    }
                }
            }
    
            public IList<E> SqlQuery(string sql, params object[] parameters)
            {
                using (YzOASysEntities context = new YzOASysEntities())
                {
                    return context.Database.SqlQuery<E>(sql, parameters).ToList();
                }
            }
        }
    

      值得注意的是public int Update(E entity, string[] propertys)该方法,因为entityframework4.x/5.0是基于DbContext,而4.0是基于ObjectContext,其实DbContext是ObjectContext的上一层封装,简化并优化了entityframework的效率,但实际操作还是必须通过ObjectContext完成,又因为DbContext实现了IObjectContextAdapter接口,我们可以通过该接口获取到ObjectContext对象,那这一切都变的好办了.通过ObjectContext我们可以获得当前上下文中的ObjectStateEntry,该对象也就是当前entity的所有状态所在,我们可以通过设置当期entity的ModifiedProperty达到指定修改某字段的效果.其实我代码中的

    if (context.Entry<E>(entity).State == EntityState.Unchanged)
                            context.Entry<E>(entity).State = EntityState.Modified;
    

      这段完全可以删除,因为当我们设置ModifiedProperty时,entityframework已经帮我们自动同步entity的State为Modified了.

    小弟的C#资历尚浅,entityframework研究得也不够透彻,只懂皮毛,若有什么不对的地方,请各位园友,牛人们指出.谢谢~

  • 相关阅读:
    Oracle 11g R2性能优化 SQL TRACE
    Oracle 11g R2创建数据库之手工建库方式
    Oracle 11g R2创建数据库之DBCA静默方式
    CentOS 7静默安装Oracle 11g R2数据库软件
    如何在Windows上使用Git创建一个可执行脚本?
    我们为什么推荐在Json中使用string表示Number属性值?
    [麻雀虽小,五脏俱全] 之网站重写之路
    2020年必须掌握的硬核技能k8s
    [半翻] 设计面向DDD的微服务
    Quartz.net在集群环境下的 部署任务的姿势
  • 原文地址:https://www.cnblogs.com/pigwing/p/2667133.html
Copyright © 2011-2022 走看看