2016-07-25 84 views
3

我有一個工作模型,包含了許多特性,和一組鏈接的實體稱爲行情:瞭解虛擬化和計算性能

public class Job 
{ 
    .... 
    public virtual ICollection<Quote> Quotes { get; set; } 
} 

在我的作業類,我有以下計算性能:

public decimal QuotesAwarded 
{ 
    get 
    { 
     if (Quotes == null || !Quotes.Any()) 
     { 
      return 0; 
     } 

     var totalUnapprovedQuotes = Quotes.Where(x => x.Status != "Approved"); 

     return 1 - (totalUnapprovedQuotes.Count()/Quotes.Count()); 

    } 
    set 
    { 

    } 

} 

我有2個問題:

  1. 當我調試此屬性,Quotes爲空(即使有附引號這個實體)。我認爲,使用virtual意味着,這不應該發生的呢?我怎樣才能確保在模型構建時,相關的報價實體被附加?

  2. 我這樣做的原因是,該屬性值存儲在數據庫中,所以它減少計算時間,因爲它是預先計算的,這是正確的?檢索作業對象時,我沒有使用Include<Quotes>

    在大多數情況下:

跟進。我僅在需要QuotesAwarded值時才使用「包含」。

但是,如果我不使用Include(比如db.jobs.find(id)),和報價爲空,而QuotesAwarded值將爲0。所以,當我保存作業對象,這將得到保存到數據庫中,我真的很迷茫我在這裏。

+0

您是使用懶惰還是渴望加載?你如何從數據庫中讀取實體? – DavidG

+0

感謝您的答覆,我已經更新了問題 –

回答

2

爲了您的第一個問題,virtual關鍵字被用作指示實體框架懶洋洋地加載此。然而,似乎已禁用延遲加載,所以你總是需要.Include(...)它。由於您的財產依賴於正在加載的報價,因此它將始終返回0.

您所做的事情幾乎是正確的,您只需讓Entity Framework知道您的屬性是計算列。要做到這一點,您只需要使用屬性對其進行註釋:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string QuotesAwarded 
{ 
    get 
    { 
     if (Quotes == null || !Quotes.Any()) 
     { 
      return 0; 
     } 

     var totalUnapprovedQuotes = Quotes.Where(x => x.Status != "Approved"); 

     return 1 - (totalUnapprovedQuotes.Count()/Quotes.Count()); 
    } 

    private set 
    { 
     //Make this private so there's no temptation to set it 
    } 
} 
+0

感謝這個@DavidG。我如何知道延遲加載是否被禁用?還有什麼讓EF知道它是一個計算列的好處? –