2017-02-19 51 views
4

我有一個像某些型號的波紋管:EF核心返回null關係,直到直達

public class Mutant 
{ 
    public long Id { get; set; } 
    ... 

    // Relations 
    public long OriginalCodeId { get; set; } 
    public virtual OriginalCode OriginalCode { get; set; } 
    public int DifficultyLevelId { get; set; } 
    public virtual DifficultyLevel DifficultyLevel { get; set; } 
} 

public class OriginalCode 
{ 
    public long Id { get; set; } 
    ... 

    // Relations 
    public virtual List<Mutant> Mutants { get; set; } 
    public virtual List<OriginalCodeInputParameter> OriginalCodeInputParameters { get; set; } 
} 

,並在DBContextOnModelCreating我做了這樣的關係:

 modelBuilder.Entity<Mutant>() 
      .HasOne(m => m.OriginalCode) 
      .WithMany(oc => oc.Mutants) 
      .HasForeignKey(m => m.OriginalCodeId) 
      .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict); 

     modelBuilder.Entity<Mutant>() 
      .HasOne(m => m.DifficultyLevel) 
      .WithMany(dl => dl.Mutants) 
      .HasForeignKey(m => m.DifficultyLevelId) 
      .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict); 

現在當我要求突變體時,OriginalCode爲空:

Null OriginalCode

,但只要我請求OriginalCode就像波紋管:

OriginalCodes

那麼突變的OriginalCode領域將是不爲空:

Filled Object

是什麼原因,我該如何解決?

TG。

回答

10

原因在EF Core文檔的Loading Related Data部分中有解釋。

第一種行爲是因爲EF Core目前不支持延遲加載,因此通常您將獲得導航屬性的null,直到您通過急切或顯式加載專門加載它們。然而,預先加載部分包含以下內容:

提示
實體框架的核心將自動修復式導航性能,以先前加載到上下文實例任何其他實體。因此,即使您沒有明確包含導航屬性的數據,如果先前加載了一些或所有相關實體,該屬性仍可能被填充。

這解釋了爲什麼導航屬性在第二種情況下不爲空。

現在,我不確定你想修復哪兩種行爲,所以會嘗試解決這兩個問題。

第一行爲可以被「固定」用的用於裝載相關的數據的當前可用的方法之一,例如急切裝載:

var mutants = db.Mutants.Include(m => m.OriginalCode).ToList(); 

第二行爲是「設計」,不能進行控制。如果您想避免它,請確保僅使用新的新實例DbContext執行單個查詢以重試所需的數據。

+0

正如你所猜想的,我想控制第一個行爲。但仍然有一個很大的問題。你提到的這種方式,我應該明確地解決待填補的關係,是真的嗎? – ConductedClever

+0

確實。你必須用幾個'Include' /'ThenInclude'方法來指定你想要「包含」的每一個。AFAIK有一些計劃將來會自動進行此操作,但現在這是唯一的選擇。 –

+0

猜猜怎麼樣,從來不知道 - 例如在你的EF核心標籤中看到一些問題 - [我可以阻止實體框架核心使用部分數據填充我的結果嗎?](http://stackoverflow.com/questions/42310340/can-i-stop-entity-framework-core-from-populating-my-result-with-partial-data):) –