FreeSql基礎入門

一、瞭解到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瞭解,如有不對的地方,感謝指導!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章