From 7bae6bd0e5d344f694ef54c1c38ef2e332fface6 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 9 Mar 2020 19:03:38 +0800 Subject: [PATCH] update --- DbContext.md | 7 +++++++ Repository.md | 30 ++++++++++++++++++++++++++++++ 修改.md | 25 +++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/DbContext.md b/DbContext.md index cec69ac..1ca6777 100644 --- a/DbContext.md +++ b/DbContext.md @@ -1,5 +1,12 @@ FreeSql.DbContext 实现类似 EFCore 使用习惯,跟踪对象状态,最终通过 SaveChanges 方法提交事务。 +## 特性 + +- Select/Attach 快照对象,Update 只更新变化的字段; +- Add/AddRange 插入数据,适配各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted; +- AddOrUpdate 插入或更新; +- SaveMany 方法快速保存导航对象(一对多、多对多); + ## 安装 > dotnet add package FreeSql.DbContext diff --git a/Repository.md b/Repository.md index 335a5b3..1ee720d 100644 --- a/Repository.md +++ b/Repository.md @@ -1,5 +1,12 @@ FreeSql.Repository 作为扩展,实现了通用仓储层功能。与其他规范标准一样,仓储层也有相应的规范定义。FreeSql.Repository 参考 abp vnext 接口,定义和实现基础的仓储层(CURD),应该算比较通用的方法吧。 +## 特性 + +- Select/Attach 快照对象,Update 只更新变化的字段; +- Insert 插入数据,适配各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted; +- InsertOrUpdate 插入或更新; +- SaveMany 方法快速保存导航对象(一对多、多对多); + ## 安装 > dotnet add package FreeSql.Repository @@ -62,6 +69,29 @@ public SongsController(GuidRepository repos1) { 更多资料:[《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) +## 状态管理 + +只更新变化的属性: +```csharp +var repo = fsql.GetRepository(); +var item = repo.Where(a => a.Id == 1).First(); //此时快照 item +item.Title = "newtitle"; +repo.Update(item); //对比快照时的变化 +//UPDATE `tb_topic` SET `Title` = ?p_0 +//WHERE (`Id` = 1) +``` + +是不是觉得先查询再更新,啰嗦? +```csharp +var repo = fsql.GetRepository(); +var item = new Topic { Id = 1 }; +repo.Attach(item); //此时快照 item +item.Title = "newtitle"; +repo.Update(item); //对比快照时的变化 +//UPDATE `tb_topic` SET `Title` = ?p_0 +//WHERE (`Id` = 1) +``` + ## 过滤与验证 假设我们有User(用户)、Topic(主题)两个实体,在领域类中定义了两个仓储: diff --git a/修改.md b/修改.md index e3695e6..71f25a6 100644 --- a/修改.md +++ b/修改.md @@ -60,6 +60,31 @@ fsql.Update(1).Set(a => new Topic ``` ## 2、更新实体 + +方法1:(推荐) + +> 只更新变化的属性,依赖 FreeSql.Repository +```csharp +var repo = fsql.GetRepository(); +var item = repo.Where(a => a.Id == 1).First(); //此时快照 item +item.Title = "newtitle"; +repo.Update(item); //对比快照时的变化 +//UPDATE `tb_topic` SET `Title` = ?p_0 +//WHERE (`Id` = 1) +``` + +> 是不是觉得先查询再更新,啰嗦? +```csharp +var repo = fsql.GetRepository(); +var item = new Topic { Id = 1 }; +repo.Attach(item); //此时快照 item +item.Title = "newtitle"; +repo.Update(item); //对比快照时的变化 +//UPDATE `tb_topic` SET `Title` = ?p_0 +//WHERE (`Id` = 1) +``` + +方法2:(原始) ```csharp var item = new Topic { Id = 1, Title = "newtitle" }; fsql.Update()