update

28810
2019-09-29 15:22:56 +08:00
parent 4aabe29343
commit b89f6e4b08
2 changed files with 25 additions and 40 deletions

@@ -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

@@ -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 };
```