Entity FrameWork(EF)6.0.2 增删修读(READ)的操作实现

第一步:首先创建一个接口,用以暴露其操作的方法

 public interface IOperate<TEntity>
    {
        List<TEntity> FindAll();
       // TEntity FindByKey(object key);
        int Add(TEntity entity);
        int AddRange(IEnumerable<TEntity> entities);
        int Delete(TEntity entity);
       // int DeleteByKey(object key);
      //  int ChangeStatus(object key, object status);
        int DeleteRange(IEnumerable<TEntity> entities);
        int Update(TEntity entity);
       // int Save(TEntity entity);
        int ExecuteSql(string cmdStr, object[] paras);
        List<TEntity> SqlQuery(string queryCmdStr, object[] paras);
    }

 

第二部:实现接口,也就是用EF实现数据库的操作

 public class EfOperate<TEntity> : IOperate<TEntity> where TEntity : class
    {
        private VehicleCheckDBEntities _module;
        private static readonly object LockHelper = new object();

        public List<TEntity> SqlQuery(string queryCmdStr, object[] paras)
        {
            try
            {
                using (_module = new VehicleCheckDBEntities())
                {
                    return paras == null ? _module.Database.SqlQuery<TEntity>(queryCmdStr).ToList() : _module.Database.SqlQuery<TEntity>(queryCmdStr, paras).ToList();
                }
            }
            catch (Exception error)
            {

                throw new Exception(error.Message);
            }

        }

        /// <summary>
        /// 执行Sql语句
        /// </summary>
        /// <returns></returns>
        public int ExecuteSql(string cmdStr, object[] paras)
        {
            /*
            const string cmdStr = "update students set name=@name where id<=@id";
            var paras = new object[]
                {
                    new SqlParameter("@name","哈哈"),
                     new SqlParameter("@id",3)
                };
            */
          
            DbContextTransaction transaction = null;

            try
            {
                lock (LockHelper)
                {
                    using (_module = new VehicleCheckDBEntities())
                    {
                        using (transaction = _module.Database.BeginTransaction())
                        {
                            int rtnNUmber = paras == null
                                       ? _module.Database.ExecuteSqlCommand(cmdStr)
                                       : _module.Database.ExecuteSqlCommand(cmdStr, paras);
                            _module.SaveChanges();
                            transaction.Commit();
                            return rtnNUmber;
                        }
                    }
                }
              
            }
            catch (Exception error)
            {
                if (transaction != null)
                    transaction.Rollback();
                throw new Exception(error.Message);
            }

        }

        protected DbSet<TEntity> DbSet
        {

            get
            {
                try
                {
                    using (_module = new VehicleCheckDBEntities())
                    {
                        return _module.Set<TEntity>();
                    }
                }
                catch (Exception error)
                {
                    throw new Exception(error.Message);
                }

            }
        }

        public List<TEntity> FindAll()
        {
            try
            {
                using (_module = new VehicleCheckDBEntities())
                {
                    return _module.Set<TEntity>().ToList();
                }
            }
            catch (Exception error)
            {
                throw new Exception(error.Message);
            }
        }

 

        /// <summary>
        /// 添加记录
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int Add(TEntity entity)
        {
            #region 方法一 已测试
#if ceshi
            using (module = new EfModule())
            {
                var entry = module.Entry(entity);
                if (entry.State == EntityState.Detached)
                {
                    entry.State = EntityState.Added;
                }
                return module.SaveChanges();

            }
#endif
            #endregion

            #region 方法二 已测试

            DbContextTransaction transaction = null;
            try
            {
                using (_module = new VehicleCheckDBEntities())
                {
                    using (transaction = _module.Database.BeginTransaction())
                    {
                        _module.Set<TEntity>().Add(entity);
                        int rtnNumber = _module.SaveChanges();
                        transaction.Commit();
                        return rtnNumber;
                    }
                }
            }
            catch (Exception error)
            {
                if (transaction != null)
                    transaction.Rollback();
                throw new Exception(error.Message);
            }

            #endregion
        }

        /// <summary>
        /// 添加多条记录
        /// </summary>
        /// <param name="entities"></param>
        /// <returns></returns>
        public int AddRange(IEnumerable<TEntity> entities)
        {
            DbContextTransaction transaction = null;
            try
            {
                using (_module = new VehicleCheckDBEntities())
                {
                    using (transaction = _module.Database.BeginTransaction())
                    {
                        _module.Set<TEntity>().AddRange(entities);
                        int rtnNumber = _module.SaveChanges();
                        transaction.Commit();
                        return rtnNumber;
                    }
                }
            }
            catch (Exception error)
            {
                if (transaction != null)
                    transaction.Rollback();
                throw new Exception(error.Message);
            }

        }

        /// <summary>
        /// 修改记录
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int Update(TEntity entity)
        {
            //修改不像Add或Remove有直接的方法,所以必须更改记录在上下文的状态为EntityState.Modified
            DbContextTransaction transaction = null;
            try
            {
                lock (LockHelper)
                {
                using (_module = new VehicleCheckDBEntities())
                {

                    using (transaction = _module.Database.BeginTransaction())
                    {

                        var entry = _module.Entry(entity);
                        if (entry.State == EntityState.Detached)
                        {
                            _module.Set<TEntity>().Attach(entity);
                            entry.State = EntityState.Modified;
                        }

                        int rtnNumber = _module.SaveChanges();
                        transaction.Commit();
                        return rtnNumber;
                    }
                      
                    }

                }
            }
            catch (Exception error)
            {
                if (transaction != null)
                    transaction.Rollback();
                throw new Exception(error.Message);
            }

        }

        /// <summary>
        /// 删除记录
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int Delete(TEntity entity)
        {
            #region 方法一 已测试 优点:使用任何类;不足之处是要手动更改记录在上下文的状态为 EntityState.Deleted,与修改原理一样

            //using (module = new EfModule())
            //{
            //    var entry = module.Entry(entity);
            //    if (entry.State == EntityState.Detached)
            //    {
            //        entry.State = EntityState.Deleted;
            //    }
            //    return module.SaveChanges();

            //}

            #endregion

            #region 方法2 已测试  直接删除,缺点: 只能使用Student类
            //using (EfModule module = new EfModule())
            //{
            //    var info = module.Students.Where(o => o.Id == 7).First();//若检索到的对象是在using外面生成的,则会报错
            //   module.Set<Student>().Remove(info);   //  module.Students.Remove(info); 两者都可以
            //   return module.SaveChanges();
            //}
            #endregion

            #region 方法3 已测试  直接删除,优点:使用任何类,把记录直接添加到上下文中,当Remove时会把状态自动改为Deleted
            DbContextTransaction transaction = null;
            try
            {
                using (_module = new VehicleCheckDBEntities())
                {
                    using (transaction = _module.Database.BeginTransaction())
                    {
                        //if (_module.Set<TEntity>().Any(o => o.Id == entity.Id))
                        //{
                        _module.Set<TEntity>().Attach(entity);
                        _module.Set<TEntity>().Remove(entity);
                        int rtnNumber = _module.SaveChanges();
                        transaction.Commit();
                        return rtnNumber;
                        //}
                        //return 0;
                    }
                }
            }
            catch (Exception error)
            {
                if (transaction != null)
                    transaction.Rollback();
                throw new Exception(error.Message);
            }

            #endregion
        }

        /// <summary>
        /// 删除多条记录
        /// </summary>
        /// <param name="entities"></param>
        /// <returns></returns>
        public int DeleteRange(IEnumerable<TEntity> entities)
        {
            DbContextTransaction transaction = null;
            try
            {
                using (_module = new VehicleCheckDBEntities())
                {
                    using (transaction = _module.Database.BeginTransaction())
                    {
                        foreach (var entity in entities)
                        {
                            //if (_module.Set<TEntity>().Any(o => o.Id == entity.Id))
                            //{
                            var entry = _module.Entry(entity);
                            if (entry.State == EntityState.Detached)
                            {
                                entry.State = EntityState.Deleted;
                            }
                            //}
                        }
                        int rtnNumber = _module.SaveChanges();
                        transaction.Commit();
                        return rtnNumber;

                    }
                }
            }
            catch (Exception error)
            {
                if (transaction != null)
                    transaction.Rollback();
                throw new Exception(error.Message);
            }

        }

    }

 

第三步:创建对象


        private static readonly IOperate<Device> DeviceOperate = new EfOperate<Device>();//创建操作表Device的对象
        public static readonly IOperate<DeviceDeny> DeviceDenyOperate = new EfOperate<DeviceDeny>();//创建操作表DeviceDeny的对象

 

第四步:调用对象的方法

  public int SaveDeviceDeny(DeviceDeny deviceDeny)
        {
            try
            {
                return deviceDeny.Id > 0 ? DeviceDenyOperate.Update(deviceDeny) : DeviceDenyOperate.Add(deviceDeny);
            }
            catch (Exception error)
            {
                throw new Exception(error.Message);
            }
        }
        public int ChangeStatus(int key, int status)
        {
            const string cmdStr = "update device set status=@status where id=@id";
            var paras = new object[]
                {
                    new SqlParameter("@status",status),
                     new SqlParameter("@id",key)
                };
            try
            {
                return DeviceOperate.ExecuteSql(cmdStr, paras);
            }
            catch (Exception error)
            {
                throw new Exception(error.Message);
            }
        
        }

        public int DeleteDevice(int key)
        {
             string cmdStr =string.Format( "delete device where id={0}",key);
            try
            {
                return DeviceOperate.ExecuteSql(cmdStr, null);
            }
            catch (Exception error)
            {
                throw new Exception(error.Message);
            }
          
        }

   public int SaveDevice(Device device)
        {
            if (device == null)
                return -1;
          
            try
            {
                if (device.Id > 0)
                {
                    const string cmdStr = "  update device set UsedTimes=isnull(UsedTimes,0)+1, LastUsingIp=@lastip,LastUsingDate=@lastdate ,LastUsingUserID=@userId where id=@id  ";
                    //var parameter = new object[]
                    //    {
                    //        new SqlParameter("@times", device.UsedTimes),
                    //        new SqlParameter("@lastip", device.LastUsingIp),
                    //        new SqlParameter("@lastdate", device.LastUsingDate),
                    //        new SqlParameter("@userId", device.LastUsingUserID),
                    //        new SqlParameter("@id", device.Id)

                    //    };
                    //return DeviceOperate.ExecuteSql(cmdStr, parameter);

                    var parameter = new DbParameter[]
                     {
                        new SqlParameter("@times", device.UsedTimes),
                         new SqlParameter("@lastip", device.LastUsingIp),
                         new SqlParameter("@lastdate", device.LastUsingDate),
                         new SqlParameter("@userId", device.LastUsingUserID),
                         new SqlParameter("@id", device.Id)

                     };
                    return DbHelper.ExecuteNonQuery(CommandType.Text, cmdStr, parameter);
                }
                return DeviceOperate.Add(device);
               
            }
            catch (Exception error)
            {
                throw new Exception(error.Message);
            }
        }

 

实践心得:

首先说一下不足之处,就是在修改方法的实现还是不尽人意,当并发调用的时候,程序会报错,大体的意思是当实体类里加载了一条记录时,修改的时候可能由于对这条数据加了锁,无法进行修改;第二个错误就是实体对象模型connection已经关闭,无法对其进行操作,但是ADD方法与Delete方法不会出现此错误,所以我在Update方法中加了Lock,错误便不会出现。也即下面代码:

    /// <summary>
        /// 修改记录
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int Update(TEntity entity)
        {
            //修改不像Add或Remove有直接的方法,所以必须更改记录在上下文的状态为EntityState.Modified
            DbContextTransaction transaction = null;
            try
            {
                lock (LockHelper)
                {
                using (_module = new VehicleCheckDBEntities())
                {

                    using (transaction = _module.Database.BeginTransaction())
                    {

                        var entry = _module.Entry(entity);
                        if (entry.State == EntityState.Detached)
                        {
                            _module.Set<TEntity>().Attach(entity);
                            entry.State = EntityState.Modified;
                        }

                        int rtnNumber = _module.SaveChanges();
                        transaction.Commit();
                        return rtnNumber;
                    }
                      
                    }

                }
            }
            catch (Exception error)
            {
                if (transaction != null)
                    transaction.Rollback();
                throw new Exception(error.Message);
            }

        }

 

PS:另如果有更优化方案,望请指点,知识用来分享,从而才能在知识中得到乐趣!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值