mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-03-18 12:00:57 +08:00
update
1
更新日志.md
1
更新日志.md
@@ -4,6 +4,7 @@
|
||||
## v0.10.5
|
||||
|
||||
- 增加 DbContext/Repository ManyToMany联级保存功能(之前已支持OneToMany);
|
||||
> wiki: https://github.com/2881099/FreeSql/wiki/%e8%81%94%e7%ba%a7%e4%bf%9d%e5%ad%98
|
||||
|
||||
## v0.10.4
|
||||
|
||||
|
||||
64
联级保存.md
64
联级保存.md
@@ -1,31 +1,33 @@
|
||||
联级保存可实现保存对象的时候,将其【OneyToMany】、【ManyToMany】导航属性集合也一并保存,本文档说明实现的机制防止误用。
|
||||
|
||||
## OneToMany 联级保存
|
||||
# 机制规则
|
||||
|
||||
```csharp
|
||||
class Cagetory
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
|
||||
[Navigate("CagetoryId")]
|
||||
public List<Goods> Goodss { get; set; }
|
||||
}
|
||||
class Goods
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public Guid CagetoryId { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
上面是【一对多】模型, Catetory 保存时可联级保存 Goodss 集合。出于使用安全考虑我们没做完整对比,只实现 Goodss 集合的添加或更新操作,所以不会删除 Goods 的数据。
|
||||
【一对多】模型下, 保存时可联级保存实体的属性集合。出于使用安全考虑我们没做完整对比,只实现实体属性集合的添加或更新操作,所以不会删除实体属性集合的数据。
|
||||
|
||||
完整对比的功能使用起来太危险,试想下面的场景:
|
||||
- 保存的时候,实体的属性集合是空的,如何操作?记录全部删除?
|
||||
- 保存的时候,由于数据库中记录非常之多,那么只想保存子表的部分数据,或者只需要添加,如何操作?
|
||||
|
||||
- 保存 Cagetory 的时候,Goodss 是个空列表,如何操作?记录全部删除?
|
||||
- 保存 Category 的时候,由于数据库中 Goodss 记录非常之多,那么只想保存 Goodss 部分数据,或者只需要添加,如何操作?
|
||||
【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(注意不会更新)
|
||||
- 属性集合为空时,删除他们的所有关联数据(中间表)
|
||||
- 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
|
||||
|
||||
# 关闭联级保存功能
|
||||
|
||||
全局关闭:
|
||||
|
||||
```csharp
|
||||
fsql.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigateList = false);
|
||||
```
|
||||
|
||||
局部关闭:
|
||||
```csharp
|
||||
var repo = fsql.GetRepository<T>();
|
||||
repo.DbContextOptions = new DbContextOptions { EnableAddOrUpdateNavigateList = false };
|
||||
```
|
||||
|
||||
## OneToMany 测试
|
||||
|
||||
测试父子关系:
|
||||
```csharp
|
||||
[Table(Name = "EAUNL_OTMP_CT")]
|
||||
class CagetoryParent
|
||||
@@ -92,12 +94,7 @@ public void EnableAddOrUpdateNavigateList_OneToMany_Parent()
|
||||
}
|
||||
```
|
||||
|
||||
## ManyToMany 联级保存
|
||||
|
||||
【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(注意不会更新)
|
||||
|
||||
- 属性集合为空时,删除他们的所有关联数据(中间表)
|
||||
- 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
|
||||
## ManyToMany 测试
|
||||
|
||||
```csharp
|
||||
[Table(Name = "EAUNL_MTM_SONG")]
|
||||
@@ -213,16 +210,3 @@ public void EnableAddOrUpdateNavigateList_ManyToMany()
|
||||
//WHERE ("Id" IN ('5d90c2dc-f28f-705c-0033-bf956ea510aa','5d90c2dc-f28f-705c-0033-bf962070dfa1'))
|
||||
}
|
||||
```
|
||||
如何关闭联级保存功能?
|
||||
|
||||
全局关闭:
|
||||
|
||||
```csharp
|
||||
fsql.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigateList = false);
|
||||
```
|
||||
|
||||
局部关闭:
|
||||
```csharp
|
||||
var repo = fsql.GetRepository<T>();
|
||||
repo.DbContextOptions = new DbContextOptions { EnableAddOrUpdateNavigateList = false };
|
||||
```
|
||||
Reference in New Issue
Block a user