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