歡迎來到《FreeSql.Repository 倉儲模式》系列文檔,本系列文檔專注介紹 【倉儲+工作單元】 的使用方式。完整文檔請前往 wiki 中心:https://github.com/dotnetcore/FreeSql/wiki
前面說到,倉儲模式推薦使用導航屬性,聯表查詢、子表查詢、級聯加載都已得到解決,本文繼續配置導航屬性之后,級聯保存如何使用。
實踐發現,N對1 不適合做級聯保存。保存 Topic 的時候把 Type 信息也保存?我個人認為自下向上保存的功能太不可控了,FreeSql 目前不支持自下向上保存。因此下面我們只講 OneToMany/ManyToMany 級聯保存。至於 ManyToOne/OneToOne 級聯保存使用手工處理,更加安全可控。
OneToMany
方式一:完整保存,對比表已存在的數據,計算出添加、修改、刪除執行
遞歸保存導航屬性不安全,不可控,並非技術問題,而是出於安全考慮,提供了手工完整保存的方式。
var repo = fsql.GetRepository<Type>();
var type = new Type
{
name = "c#",
Topics = new List<Topic>(new[] {
new Topic
{
...
}
})
};
repo.Insert(type);
repo.SaveMany(type, "Topics"); //手工完整保存 Topics
請確認機制:
- 有可能刪除表已存在的數據,確認?
- 當 Topics 屬性為 Empty 時,刪除 type 存在的 Topics 所有表數據,確認?
- 保存 Topics 的時候,不、不、不保存 Childs[0-..] 的下級集合屬性,只保存 Topics 當前層級,確認?
方法二:追加保存,不刪除表已存在的數據
此方式建議用在不太重要的功能,或者測試數據添加
var repo = fsql.GetRepository<Type>();
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
repo.DbContextOptions.NoneParameter = true;
repo.Insert(new Type
{
name = "c#",
Topics = new List<Topic>(new[] {
new Topic
{
...
}
})
});
請確認機制:
- 不刪除表已存在的數據,確認?
- 當 Topics 屬性為 Empty 時,不做任何操作,確認?
- 保存 Childs 的時候,還會保存 Childs[0-..] 的下級集合屬性,向下18層,確認?
向下18層的意思,比如【類型】表,下面有集合屬性【文章】,【文章】下面有集合屬性【評論】。
保存【類型】表對象的時候,他會向下檢索出集合屬性【文章】,然后如果【文章】被保存的時候,再繼續向下檢索出集合屬性【評論】。一起做 InsertOrUpdate 操作。
ManyToMany
配置好的 ManyToMany 多對多導航屬性,支持級聯保存,並且只有一種機制:完整保存。
開啟 EnableAddOrUpdateNavigateList 或者 SaveMany 都是完整保存。