在將 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 回答

白衣非少年
TA貢獻1155條經驗 獲得超0個贊
相關的引用/集合屬性必須預先加載或顯式加載。您通常希望使用以下方式急切加載Include
:
var clients = await _context.Clients.Include(x => x.Configurations).ToListAsync();
或者,您可以延遲加載,但這通常不是一個好主意,因為它會導致 N+1 查詢問題(即您發出一個查詢,然后在迭代時對每個項目進行單獨的附加查詢,這顯然效率很低). 無論如何,延遲加載需要兩件事:
引用/集合屬性必須具有
virtual
關鍵字。EF 通過創建實體類的動態代理并覆蓋屬性 getter 來添加延遲加載功能。當然,覆蓋只能在虛擬機上進行。您必須顯式添加延遲加載服務:
services.AddDbContext<MyContext>(o => o.UseLazyLoadingProxies() .UseSqlServer(connectionString));
它在您查詢配置時也有效,因為 EF 具有對象修復。換句話說,如果它之前已經檢索到這些對象并將它們放在對象緩存中,它將自動填充相關的引用/集合屬性。否則,如果您不以其他方式加載關系,該屬性將保持為空。
- 2 回答
- 0 關注
- 141 瀏覽
添加回答
舉報
0/150
提交
取消