FreeSql.Repository (九)級聯保存


歡迎來到《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 都是完整保存。

系列文章導航


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM