[英]EF6 - Lazy loading related entity always null
由於某種原因,相關實體的延遲加載總是變成NULL。我認為我遵循了所有需要的規則來申請代理生成,但是我似乎無法解決這個問題。
我有一個 object tblOrder_Procedure,它有一個 tblRoom 和一個 tblProcedure。 由於某種原因,tblProcedure 總是自動加載,但 tblRoom 不會。 然而 FK 在那里,但相關的實體只是沒有加載。
所有類都有公共無參數構造函數。
這些是字段定義:
public int? Procedure_UID { get; set; }
public int? Room_UID { get; set; }
public virtual tblRoom tblRoom { get; set; }
public virtual tblProcedure tblProcedure { get; set; }
我不使用注釋,而是使用流利的上下文的 OnModelCreating 方法 API。FK 是這樣完成的:
modelBuilder.Entity<tblRoom>()
.HasMany(e => e.tblOrder_Procedure)
.WithOptional(e => e.tblRoom)
.HasForeignKey(e => e.Room_UID);
modelBuilder.Entity<tblProcedure>()
.HasMany(e => e.tblOrder_Procedure)
.WithOptional(e => e.tblProcedure)
.HasForeignKey(e => e.Procedure_UID);
ProxyCreationEnabled 和 LazyLoadingEnabled 默認情況下都為真。
我錯過了什么?
我會寫下兩種最有可能的可能性。
-也許您正在某處顯式使用 .AsNoTracking() 擴展名或被您編寫的另一個助手隱藏。
- 你可以嘗試添加optionsBuilder.UseLazyLoadingProxies(); 到 Context.OnConfiguring(DbContextOptionsBuilder optionsBuilder)。
我想出了問題是什么。 它有兩個起源:
我正在使用新創建並插入數據庫的 object 來嘗試使用延遲加載。 事實證明,您隨后需要使用 .Create() 而不是“new”來創建 object。
原來我使用的是一個壽命太長的數據庫上下文。 在出現問題之前的某個地方,tblProcedure object 已經加載到上下文緩存中,因此可以解決外鍵關系。 這讓它看起來像是延遲加載,但實際上不是。
afaik,如果您使用虛擬關鍵字,則應使用“include”方法。
modelBuilder.Entity<tblRoom>()
.Include(f=>f.tbl_room)
.HasMany(e => e.tblOrder_Procedure)
.WithOptional(e => e.tblRoom),
.HasForeignKey(e => e.Room_UID);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.