.Net Core中使用Freesql

之前写过一篇在.net framework中使用freesql的文章,这篇文章讲解在.net core中使用,演示环境为.net 2.1

 

一、Startup中启用和注入:

    public class Startup
    {
        public IFreeSql FrSql { get; private set; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;

            //标准连接字符串
            string baseStrConn = "Data Source=.;Initial Catalog=数据库名称;Pooling=true;Min Pool Size=1;uid=sa;pwd=sa密码;";
            //构建freesql对象
            this.FrSql = new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, baseStrConn).UseAutoSyncStructure(true).Build();
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            //注入freesql
            services.AddSingleton(this.FrSql);
            //注入数据库工具类
            services.AddSingleton<ILingbugFreeSqlUtil, LingbugFreeSqlUtil>();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=TestHdeviceIndex}/{id?}");
            });
        }
    }

 

二、工具类(主要讲解事务和指定列修改):

    public class LingbugFreeSqlUtil : ILingbugFreeSqlUtil
    {
        private IFreeSql _dbContext;

        public LingbugFreeSqlUtil(IFreeSql frSql)
        {
            //依赖注入
            this._dbContext = frSql;
        }

        public void RunWithTransaction(IsolationLevel? transactionLevel, Action<DbTransaction> action)
        {
            using (var uow = _dbContext.CreateUnitOfWork())
            {
                try
                {
                    //指定事务级别
                    if (transactionLevel.HasValue) uow.IsolationLevel = transactionLevel;
                    //开启事务
                    var tran = uow.GetOrBeginTransaction();
                    //记录日志
                    LingbugService.Log("RunWithTransaction - 事务", tran.ToJsonString());

                    //执行逻辑
                    action(tran);

                    //提交事务
                    uow.Commit();
                }
                catch (Exception ex)
                {
                    //回滚事务
                    uow.Rollback();
                    //抛出异常
                    throw;
                }
            }
        }

        public IUpdate<T> Update<T>(T data, DbTransaction transaction) where T : BaseDbModel
        {
            /*
             * 修改注意点:
             * 1.设置实体使用SetSource方法,且实体的主键字段必须赋值,否则无法where到
             * 2.不会修改主键字段,不用担心
             */

            //修改对象
            var up = _dbContext.Update<T>().SetSource(data).IgnoreColumns(data.GetUnChanged());
            //设置事务
            if (transaction != null) up = up.WithTransaction(transaction);
            //返回
            return up;
        }
    }

 

三、使用:

    public class HomeController : Controller
    {
        private IFreeSql _dbContext;

        private ILingbugFreeSqlUtil _freesqlUtil;

        public HomeController(IFreeSql frSql, ILingbugFreeSqlUtil freesqlUtil)
        {
            //依赖注入
            this._dbContext = frSql;
            this._freesqlUtil = freesqlUtil;
        }

        #region 自带

        public IActionResult Index()
        {
            //try
            //{
            //    //string pwd = Encrypt.MD5Encrypt("zwh123");
            //    //LogManager.Info(pwd);
            //    //var source = Encoding.GetEncoding("gb2312");
            //    //var target = Encoding.UTF8;
            //    //var bytes = source.GetBytes(pwd);
            //    //var newBytes = Encoding.Convert(source, target, bytes);
            //    //string newPwd = target.GetString(newBytes);
            //    //string sql = @"SELECT * FROM dbo.LingbugTaskInfo";
            //    //var dt = _FrSql.Ado.ExecuteDataTable(sql);
            //    //string json = JsonConvert.SerializeObject(dt);
            //    //var list = JsonConvert.DeserializeObject<List<TaskModel>>(json);
            //    //var taskList = _FrSql.Ado.Query<TaskModel>(sql);
            //    //var assembly = Assembly.GetAssembly(typeof(CacheHelper));
            //    //var types = assembly.GetTypes();
            //    LogManager.LogDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");
            //    //LogManager.Info(JsonConvert.SerializeObject(types.Select(r => r.Name).Distinct().OrderBy(r => r)));
            //    //string flag = "Success";
            //}
            //catch (Exception ex)
            //{
            //    LogManager.Error(ex);
            //}
            return View();
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";

            return View();
        }

        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";

            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }

        public IActionResult TestHdeviceIndex()
        {
            return View();
        }

        #endregion

        private void Aop<T>(object sender, T e, string methodName)
        {
            //需要记录日志的属性名
            var procNames = "Log,ElapsedTicks,ElapsedMilliseconds,Command,ExecuteResult,Sql".Split(',');
            //类型
            var t = e.GetType();
            //属性集合
            var procList = t.GetProperties();
            //找到属性
            var logProc = procList.FirstOrDefault(r => r.Name == "Log");
            if (logProc == null)
            {
                //返回
                return;
            }
            //数据
            var data = new JObject();
            //事件名
            data.Add("EventName", JToken.FromObject(methodName));
            //日志
            data.Add("Log", JToken.FromObject(logProc.GetValue(e)));
            参数类型
            //data.Add("ParameterType", JToken.FromObject($"{t.Name}({t.FullName})"));
            属性名
            //data.Add("ProcList", JToken.FromObject(procList.Select(r => r.Name)));
            //procNames.ForEach(name =>
            //{
            //    //找到属性
            //    var proc = procList.FirstOrDefault(r => r.Name == name);
            //    if (proc != null)
            //    {
            //        //读取数据
            //        var value = proc.GetValue(e);
            //        //添加到实体中
            //        data.Add(name, JToken.FromObject(value));
            //    }
            //});
            //记录日志
            LingbugService.Log(methodName, data.ToString());
            //LogHelper.Debug(data.ToString());
            //LogHelper.Debug($"{methodName} - {nameof(e)}:type = {t.Name}({t.FullName}),属性:{procList.Select(r => $"{r.Name}【{r.PropertyType.Name}】").Join()}");
        }

        public async Task<string> TestFreeSql()
        {
            try
            {
                #region Aop

                //过滤器
                _dbContext.Aop.CommandBefore += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "CommandBefore");
                };
                _dbContext.Aop.CommandAfter += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "CommandAfter");
                };
                _dbContext.Aop.AuditValue += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "AuditValue");
                };
                _dbContext.Aop.SyncStructureBefore += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "SyncStructureBefore");
                };
                _dbContext.Aop.SyncStructureAfter += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "SyncStructureAfter");
                };
                _dbContext.Aop.CurdBefore += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "CurdBefore");
                };
                _dbContext.Aop.CurdAfter += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "CurdAfter");
                };
                _dbContext.Aop.TraceBefore += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "TraceBefore");
                };
                _dbContext.Aop.TraceAfter += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "TraceAfter");
                };
                _dbContext.Aop.ConfigEntityProperty += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "ConfigEntityProperty");
                };
                _dbContext.Aop.ConfigEntity += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "ConfigEntity");
                };
                _dbContext.Aop.ParseExpression += (sender, e) =>
                {
                    //记录日志
                    Aop(sender, e, "ParseExpression");
                };


                #endregion

                查询
                //var list = _dbContext.Select<WorkLogInfo>().ToList();
                查询
                //var dt = _dbContext.Ado.ExecuteDataTable(@"SELECT * FROM dbo.WorkLogInfo a ORDER BY a.CreateDate DESC");
                记录日志
                //LogHelper.Debug(dt.ToJsonString());

                新增
                //var newId = _dbContext.Insert(new WorkLogInfo()
                //{
                //    Content = "店铺国家校验非空",
                //    LogType = 1,
                //    CreateDate = DateTime.Now,
                //    IsDel = false
                //}).ExecuteIdentity();

                新增产品
                //var productList = await _dbContext.Insert("西装,手表,电脑".Split(',').Select(r => new ProductInfo()
                //{
                //    Name = r,
                //    OperateDate = DateTime.Now
                //})).ExecuteInsertedAsync();

                新增评论
                //var reviewCount = await _dbContext.Insert(productList.SelectMany(p =>
                //{
                //    return Enumerable.Range(1, 100).Select(r => new ReviewInfo()
                //    {
                //        ProductId = p.Id,
                //        Review = $"这个{p.Name}太棒了 - {r}",
                //        OperateDate = DateTime.Now
                //    }).ToList();
                //})).ExecuteInsertedAsync();

                查询
                //var list = _dbContext.Select<ProductInfo>().IncludeMany(r => r.ReviewList).ToList();
                记录日志
                //LingbugService.Log(null, list.ToJsonString());

                using (var uow = _dbContext.CreateUnitOfWork())
                {
                    try
                    {
                        //指定事务级别
                        uow.IsolationLevel = IsolationLevel.Serializable;
                        //事务
                        var tran = uow.GetOrBeginTransaction();
                        //记录日志
                        LingbugService.Log("事务", tran.ToJsonString());
                        //查询
                        var list = _dbContext.Select<ProductInfo>().WithTransaction(tran).ToList();
                        //休息
                        Thread.Sleep(30 * 1000);
                        //新增
                        _dbContext.Insert(new ProductInfo()
                        {
                            Name = "裤子456",
                            OperateDate = DateTime.Now
                        }).WithTransaction(tran).ExecuteAffrows();

                        //新增
                        _dbContext.Insert(new ProductInfo()
                        {
                            Name = "皮带456",
                            OperateDate = DateTime.Now
                        }).WithTransaction(tran).ExecuteAffrows();

                        //提交事务
                        uow.Commit();
                    }
                    catch (Exception ex)
                    {
                        //回滚事务
                        uow.Rollback();
                        //抛出异常
                        throw;
                    }
                }

                //返回
                return new
                {
                    IsSuccess = true,
                    Message = "ok"
                }.ToJsonString();
            }
            catch (Exception ex)
            {
                //返回
                return new
                {
                    IsSuccess = false,
                    Message = ex.Message,
                    Exception = ex
                }.ToJsonString();
            }
        }

        public async Task<string> TestFreeSqlNew()
        {
            try
            {
                查询
                //var list = _dbContext.Select<WorkLogInfo>().ToList();
                查询
                //var dt = _dbContext.Ado.ExecuteDataTable(@"SELECT * FROM dbo.WorkLogInfo a ORDER BY a.CreateDate DESC");
                记录日志
                //LogHelper.Debug(dt.ToJsonString());

                新增
                //var newId = _dbContext.Insert(new WorkLogInfo()
                //{
                //    Content = "店铺国家校验非空",
                //    LogType = 1,
                //    CreateDate = DateTime.Now,
                //    IsDel = false
                //}).ExecuteIdentity();

                新增产品
                //var productList = await _dbContext.Insert("西装,手表,电脑".Split(',').Select(r => new ProductInfo()
                //{
                //    Name = r,
                //    OperateDate = DateTime.Now
                //})).ExecuteInsertedAsync();

                新增评论
                //var reviewCount = await _dbContext.Insert(productList.SelectMany(p =>
                //{
                //    return Enumerable.Range(1, 100).Select(r => new ReviewInfo()
                //    {
                //        ProductId = p.Id,
                //        Review = $"这个{p.Name}太棒了 - {r}",
                //        OperateDate = DateTime.Now
                //    }).ToList();
                //})).ExecuteInsertedAsync();

                查询
                //var list = _dbContext.Select<ProductInfo>().IncludeMany(r => r.ReviewList).ToList();
                记录日志
                //LingbugService.Log(null, list.ToJsonString());

                //新增
                await _dbContext.Insert(new ProductInfo()
                {
                    Name = "其他方法新增的裤子",
                    OperateDate = DateTime.Now
                }).ExecuteAffrowsAsync();

                //返回
                return new
                {
                    IsSuccess = true,
                    Message = "ok"
                }.ToJsonString();
            }
            catch (Exception ex)
            {
                //返回
                return new
                {
                    IsSuccess = false,
                    Message = ex.Message,
                    Exception = ex
                }.ToJsonString();
            }
        }

        public async Task<string> TestFreeSqlUtil()
        {
            try
            {
                修改对象
                //await _freesqlUtil.Update(new ReviewInfo()
                //{
                //    Id = 1,
                //    Review = "这个西装太棒了 - 1 - 222",
                //    OperateDate = DateTime.Now
                //}, null).ExecuteAffrowsAsync();

                _freesqlUtil.RunWithTransaction(IsolationLevel.Serializable, tran =>
               {
                   //记录日志
                   LingbugService.Log("RunWithTransaction - 事务对象", tran.ToJsonString());

                   //新增
                   _dbContext.Insert(new ProductInfo()
                   {
                       Name = "皇冠fdsfdsfdfds真的吗?",
                       OperateDate = DateTime.Now
                   }).WithTransaction(tran).ExecuteAffrows();

                   //抛异常
                   throw new Exception("出错了");

                   //要修改的对象
                   var updateModel = new ReviewInfo()
                   {
                       Id = 2,
                       Review = "这个西装太棒了 - 1 - fdsfdsfdfds真的吗?",
                       OperateDate = DateTime.Now
                   };
                   //修改对象
                   _freesqlUtil.Update(updateModel, tran).ExecuteAffrows();
                   //修改对象
                   //_dbContext.Update<ReviewInfo>().SetSource(updateModel).WithTransaction(tran).ExecuteAffrows();
               });

                //返回
                return new
                {
                    IsSuccess = true,
                    Message = "ok"
                }.ToJsonString();
            }
            catch (Exception ex)
            {
                //返回
                return new
                {
                    IsSuccess = false,
                    Message = ex.Message,
                    Exception = ex
                }.ToJsonString();
            }
        }
    }

 

Ending~

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值