zoukankan      html  css  js  c++  java
  • FreeSql基础入门

    github地址:https://github.com/dotnetcore/FreeSql/wiki

    一、了解到FreeSql

         ORM框架是很早之前就在接触了比如CYQ.Data,这段时间在群里面发现有的猿在用一个新的ORM框架,这个也是由于自己刚刚得知有这么个ORM的原因,那就是FreeSql,这是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.5+,目前更新到了0.9版本,FreeSql 使用模型执行数据访问,模型由实体类表示数据库表或视图,用于查询和保存数据。

    二、安装FreeSql

         第1种: 通过NuGet程序包里面搜索FreeSql,可以搜索到FreeSql的安装包和支持的数据库安装包,FreeSql.DbContext是必须要的,然后是数据库连接,此处用的是SqlServer,所以安装了FreeSql.Provider.SqlServer。

         第2种:通过控制台程序命令安装,GitHub提供的是 dotnet add package FreeSql,但是此处安装中会提示找不到包,估计是由于不是原始包的原因,采用了dotnet add   项目名称 package FreeSql  就可以解决,不过还是建议采用第一种方式进行安装.

    三、项目配置和使用:此处采用的是dotnet Core API

         1、创建数据库,配置数据

         

         2、添加dotnet core api项目(这里不再详细说明,反正大家都会....)

         3、配置项目,此处只是实例,所以没有用到批量注入,如有需要了解ORM批量注入的猿友可以查看:https://www.cnblogs.com/chj929555796/p/11114684.html    

    复制代码
    public static IFreeSql Fsql { get; private set; }
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
    
                Fsql = new FreeSql.FreeSqlBuilder()
                    .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Initial Catalog=FQDemo;Integrated Security=False;User ID=sa;Password=123456")
                    .UseAutoSyncStructure(true)
                    .UseLazyLoading(true)
                    .UseNoneCommandParameter(true)
                    .Build();
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
                //注入
                services.AddSingleton<IFreeSql>(Fsql);
                services.AddFreeDbContext<StudentContext>(options => options.UseFreeSql(Fsql));
    
            }
    复制代码

     4、添加Model    

    复制代码
      public class StuClass
        {
            public int ID { get; set; }
    
            public string ClassName { get; set; }
        }
      //如果数据库表名和实体表名不一致的情况下需要通过Table来指定数据库表名
      [Table(Name = "Student")]  
        public class Student
        {
            //唯一键标识,不然数据库表字段会根据实体重新生成
            [Column(IsIdentity = true)]
            public int StuNo { get; set; }
    
            public string StuName { get; set; }
    
            public int StuAge { get; set; }
            public int ClassID { get; set; }
    
            public StuClass StuClass { get; set; }
        }
    复制代码

       

    5、添加一个StudentController控制器,通过构造函数注入

    获取数据实例:

    复制代码
    public Object GetStudentList()
            {
                ISelect<Student> select = _fsOrm.Select<Student>();
                //多表联合查询(无导航属性联表)
                List<Student> stuJoinDHList = select.LeftJoin<StuClass>((s, c) => s.ClassID == c.ID).ToList();
                //多表联合查询(导航属性联表:s.StuClass.ID为导航属性)
                List<Student> stuJoinList = select.LeftJoin(s => s.ClassID == s.StuClass.ID).ToList();
                //查询所有
                List<Student> stuList = select.ToList();
                //条件查询
                List<Student> stuWhereList = select.Where(s => s.ClassID == 2).ToList();
                //分页查询Page(页码:1开始,每页大小:如每页20条),OrderByDescending倒序,默认为正序
                List<Student> stuPageList = select.Where(s => s.ClassID == 2).Page(1, 20).OrderByDescending(o => o.StuNo).ToList();
                return Newtonsoft.Json.JsonConvert.SerializeObject(stuList);
            }
    复制代码

    新增数据实例:

    复制代码
     public Object AddStudent()
            {
                FreeSql.IInsert<Student> addStu = _fsOrm.Insert<Student>();
                //添加一行
                Student student = new Student();
                student.StuName = "王五";
                student.StuAge = 0;
                int count1 = addStu.AppendData(student).ExecuteAffrows();
                //批量添加
                List<Student> students = new List<Student>();
                students.Add(new Student()
                {
                    StuName = "",
                    StuAge = 1
                });
                students.Add(new Student()
                {
                    StuName = "",
                    StuAge = 1
                });
                int count2 = addStu.AppendData(students).ExecuteAffrows();
                return true;
            }
    复制代码

    修改数据实例:

    复制代码
     public Object UpdateStudent()
    
            {
                IUpdate<Student> updateStu = _fsOrm.Update<Student>();
                //更新单列
                int count = updateStu.Set(s => s.StuAge, 0).Where(w => w.StuNo == 5).ExecuteAffrows();
                //更新多列
                Student item = new Student { StuNo = 5, StuAge = 1, StuName = "" };
                int count1 = updateStu.SetSource(item).ExecuteAffrows();
                //批量跟新
                List<Student> students = new List<Student>();
                students.Add(new Student
                {
                    StuNo = 4,
                    StuName = "张飞",
                    StuAge = 1
                });
                students.Add(new Student
                {
                    StuNo = 5,
                    StuName = "毕傲婵",
                    StuAge = 0
                });
                int count2 = updateStu.SetSource(students).ExecuteAffrows();
                students.Clear();
                //保存实体忽略列
                students.Add(new Student
                {
                    StuNo = 4,
                    StuName = "张飞1",
                    StuAge = 0
                });
                students.Add(new Student
                {
                    StuNo = 5,
                    StuName = "毕傲婵1",
                    StuAge = 1
                });
                int count3 = updateStu.SetSource(students).IgnoreColumns(i => i.StuAge).ExecuteAffrows();
                students.Clear();
                //只更新指定的列
                students.Add(new Student
                {
                    StuNo = 4,
                    StuName = "张飞",
                    StuAge = 0
                });
                students.Add(new Student
                {
                    StuNo = 5,
                    StuName = "毕傲婵",
                    StuAge = 1
                });
                int count4 = updateStu.UpdateColumns(s => s.StuName).ExecuteAffrows();
                return count;
            }
    复制代码

    删除数据实例,此处删除数据只用了"事务"删除,包括了Transaction、UnitOfWork两种,其他不通过事务和DBContext(暂未发现有Delete操作,不知道后期造轮子的大佬会不会加一颗零件)请自行发挥。

    复制代码
    public Object DeleteStu()
            {
                IDelete<Student> delStu = _fsOrm.Delete<Student>();
                IDelete<StuClass> delStuClass = _fsOrm.Delete<StuClass>(); 
                //同线程事务
                _fsOrm.Transaction(() =>
                {
                    int count = delStu.Where(w => w.ClassID == 1).ExecuteAffrows();
                    if (count > 0)
                        count = delStuClass.Where(w => w.ID == 1).ExecuteAffrows();
                    if (count < 1)
                        throw new Exception("处理失败,事务回滚");
                });
                //CreateUnitOfWork(UnitOfWork + Repository)
                using (IRepositoryUnitOfWork sw = _fsOrm.CreateUnitOfWork())
                {
                    var delStu1 = sw.GetRepository<Student>();
                    var delStuClass1 = sw.GetRepository<StuClass>();                
                    int count = delStu1.Delete(d => d.ClassID == 2);
                    count = delStuClass1.Delete(d => d.ID == 5);
                    if (count > 0)
                    {
                        sw.Commit();
                    }
                    else
                    {
                        sw.Rollback();
                        throw new Exception("处理失败,事务回滚");
                    }
                };            
                return true;
            }
    复制代码

    以上就是学习FreeSql的入门记录,还有很多实例没有一一列举,如有需要的猿友可到https://github.com/2881099/FreeSql/wiki了解,如有不对的地方,感谢指导!

    ************转摘:https://www.cnblogs.com/chj929555796/p/11557074.html

  • 相关阅读:
    归并排序(Merge Sort)
    AtCoder AGC035D Add and Remove (状压DP)
    AtCoder AGC034D Manhattan Max Matching (费用流)
    AtCoder AGC033F Adding Edges (图论)
    AtCoder AGC031F Walk on Graph (图论、数论)
    AtCoder AGC031E Snuke the Phantom Thief (费用流)
    AtCoder AGC029F Construction of a Tree (二分图匹配)
    AtCoder AGC029E Wandering TKHS
    AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
    AtCoder AGC035E Develop (DP、图论、计数)
  • 原文地址:https://www.cnblogs.com/linybo/p/13931483.html
Copyright © 2011-2022 走看看