亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

使用 EFCore 檢索集合時,為什么檢索到的實體不包括它們與其他對象的關系?

使用 EFCore 檢索集合時,為什么檢索到的實體不包括它們與其他對象的關系?

C#
嚕嚕噠 2022-12-04 13:22:11
在將 Entity Framework Core 與 SQL Server 一起使用時,我遇到了一個意想不到的問題。我有一個實體 A 與實體 B 具有一對多關系。 [Table("client")]    public class Client    {        public long ID { get; set; }        public string Name { get; set; }        public ICollection<Configuration> Configurations { get; set; } = new LinkedList<Configuration>();    }我從數據庫中得到實體 A 的實例列表,如下所示:public ICollection<Client> GetAllClients(){    return _dbContext.Clients.ToList();}當我調用這個函數時,我得到一個實例列表,關系中沒有實體 B 的實例。為什么沒有正確檢索到關系中的對象?我還發現,如果我將這行代碼添加到函數中,就會按預期檢索實體。public ICollection<Client> GetAllClients(){    var test = _dbContext.Configurations.ToList();    return _dbContext.Clients.ToList();}這對我來說毫無意義。我在這里錯過了什么?
查看完整描述

2 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

您可以使用 Include 方法指定要包含在查詢結果中的相關數據(預加載)。


看看下面的例子:


public ICollection<Client> GetAllClients()

{

    return _dbContext.Clients.Include(x => x.Configurations).ToList();

}

您可以查看MSDN 參考資料。



查看完整回答
反對 回復 2022-12-04
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

相關的引用/集合屬性必須預先加載或顯式加載。您通常希望使用以下方式急切加載Include

var clients = await _context.Clients.Include(x => x.Configurations).ToListAsync();

或者,您可以延遲加載,但這通常不是一個好主意,因為它會導致 N+1 查詢問題(即您發出一個查詢,然后在迭代時對每個項目進行單獨的附加查詢,這顯然效率很低). 無論如何,延遲加載需要兩件事:

  1. 引用/集合屬性必須具有virtual關鍵字。EF 通過創建實體類的動態代理并覆蓋屬性 getter 來添加延遲加載功能。當然,覆蓋只能在虛擬機上進行。

  2. 您必須顯式添加延遲加載服務:

    services.AddDbContext<MyContext>(o => o.UseLazyLoadingProxies()
        .UseSqlServer(connectionString));

它在您查詢配置時也有效,因為 EF 具有對象修復。換句話說,如果它之前已經檢索到這些對象并將它們放在對象緩存中,它將自動填充相關的引用/集合屬性。否則,如果您不以其他方式加載關系,該屬性將保持為空。


查看完整回答
反對 回復 2022-12-04
  • 2 回答
  • 0 關注
  • 141 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號