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

  • 相关阅读:
    CODEVS 3137 栈练习1
    CODEVS 3138 栈练习2
    线段树———模板
    深度优先搜索与广度优先搜索———模板
    犯罪团伙 codevs 3554
    嘟!数字三角形 W WW WWW集合!
    寻找子串位置 codevs 1204
    流输入练习——寻找Sb.VI codevs 3096
    C++之路进阶——codevs3287(货车运输)
    c++之路进阶——codevs4543(普通平衡树)
  • 原文地址:https://www.cnblogs.com/linybo/p/13931483.html
Copyright © 2011-2022 走看看