第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將子級添加到列表中的實體框架性能問題

將子級添加到列表中的實體框架性能問題

C#
MMTTMM 2022-06-19 10:29:16
我正在開發(fā)一個使用實體框架 6.1.3 的項目?,F(xiàn)在,在將子對象添加到父實體列表時,我們遇到了相當(dāng)大的性能問題(請參見下面的代碼示例)。我們正在使用延遲加載,所以我注意到在我們調(diào)用之前一切正常,_parent.Children.Add(child);因為它似乎從數(shù)據(jù)庫中加載所有子節(jié)點只是為了能夠添加一個新的子節(jié)點。由于我們的一些父對象有大約 50,000 個子對象,這會延遲這個簡單的插入調(diào)用 7-8 秒,有時甚至?xí)?dǎo)致超時。對我來說,實體框架加載所有子節(jié)點只是為了添加一個子節(jié)點并沒有什么意義,那么有沒有辦法可以避免這種情況,或者這是實體框架的設(shè)計缺陷,我們應(yīng)該找到解決方法嗎?我顯然想為此找到一個解決方案,并且不希望不必為這個問題實現(xiàn)純 ADO 查詢。謝謝!public class Parent {    public Guid Id { get; set; }    public virtual ICollection<Child> Children { get; set; }}public class Child{    public Guid Id { get; set; }}public class ParentAggregate{    private readonly Parent _state;    public ParentAggregate(Parent state)    {        _state = state;    }    public void AddChild(Guid id)    {        var child = new Child { Id = id };        _state.Children.Add(child);    }}
查看完整描述

1 回答

?
吃雞游戲

TA貢獻1829條經(jīng)驗 獲得超7個贊

對我來說,實體框架加載所有孩子只是為了添加一個真的沒有意義


延遲加載發(fā)生在您第一次通過其getter訪問導(dǎo)航屬性時。以及示例代碼


_parent.Children.Add(child);

由兩個操作組成:


(1)檢索Children屬性(通過屬性getter!):


var children = _parent.Children;

(2)對其進行一些操作(Add本例中調(diào)用方法):


children.Add(child);

延遲加載是由于操作 (1) 而發(fā)生的。如您所見,EF 與此無關(guān),因為它無法控制它。并且沒有辦法知道您將如何處理該屬性值 - 枚舉它,進行計數(shù)或使用Add等Remove方法。


這里有一些解決方案。


首先,為什么要使用延遲加載?它有很多副作用和低效率,所有這些都可以通過 EF 提供的開箱即用的急切加載Include方法輕松解決。這就是為什么默認情況下 EF Core(“EF 的未來”)默認情況下不使用延遲加載,并且需要一個特殊的包和過程來啟用它。


其次,如果你堅持使用延遲加載,那么你有以下兩種選擇:


(A) 在數(shù)據(jù)修改期間禁用延遲加載(需要訪問/控制DbContext實例):


dbContext.Configuration.LazyLoadingEnabled = false;

_parent.Children.Add(child);

dbContext.Configuration.LazyLoadingEnabled = true;

這也需要初始化集合屬性以避免 NRE。


(B) 使用顯式支持字段并提供對其的直接訪問(以避免觸發(fā)屬性訪問器的延遲加載)。例如:


public class Parent 

{

    public Guid Id { get; set; }


    private ICollection<Child> children;

    public virtual ICollection<Child> Children { get => children; set => children = value; }


    public void Add(Child child)

    {

        // use the backing field directly

        if (children == null) children = new HashSet<Child>();

        children.Add(child); 

    }

}


查看完整回答
反對 回復(fù) 2022-06-19
  • 1 回答
  • 0 關(guān)注
  • 122 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號