在將 Entity Framework Core 與 SQL Server 一起使用時,我遇到了一個意想不到的問題。我有一個實體 A 與實體 B 具有一對多關(guān)系。 [Table("client")] public class Client { public long ID { get; set; } public string Name { get; set; } public ICollection<Configuration> Configurations { get; set; } = new LinkedList<Configuration>(); }我從數(shù)據(jù)庫中得到實體 A 的實例列表,如下所示:public ICollection<Client> GetAllClients(){ return _dbContext.Clients.ToList();}當我調(diào)用這個函數(shù)時,我得到一個實例列表,關(guān)系中沒有實體 B 的實例。為什么沒有正確檢索到關(guān)系中的對象?我還發(fā)現(xiàn),如果我將這行代碼添加到函數(shù)中,就會按預(yù)期檢索實體。public ICollection<Client> GetAllClients(){ var test = _dbContext.Configurations.ToList(); return _dbContext.Clients.ToList();}這對我來說毫無意義。我在這里錯過了什么?
2 回答

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