簡體   English   中英

EF6 - 延遲加載相關實體始終 null

[英]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)。

我想出了問題是什么。 它有兩個起源:

  1. 我正在使用新創建並插入數據庫的 object 來嘗試使用延遲加載。 事實證明,您隨后需要使用 .Create() 而不是“new”來創建 object。

  2. 原來我使用的是一個壽命太長的數據庫上下文。 在出現問題之前的某個地方,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM