2015-11-01 73 views
0

我在模型中使用數據庫時遇到了一些問題。我懷疑在Model中使用數據庫查詢不是個好主意,但我不知道如何更好地實現它。我希望你能給我一些建議。Enitity Framework模型中的數據庫查詢 - 變量等於零

代碼:

讓我們假設我有一些應用程序analize足球比分。我有一個存儲有關足球運動員的信息有些EF型號:

public class Player 
{ 
[...] 
public virtual ICollection<Goal> HisGoals { get; set; } 
public float Efficiency 
     { 
      get 
      { 
       using(var db = new ScoresContext()) 
       { 
        var allGoalsInSeason = db.Goals.Count(); 
        return HisGoals.Count/allGoalsInSeason; 
       } 
      } 
     } 
} 

問題:

所以情況是:我想要有所謂的「效率」,將返回兩個商在我的模型中的變量變量。其中之一包含從數據庫實時獲取的數據。 目前這段代碼不起作用。 「效率」等於0.我嘗試使用調試器,所有數據都是正確的,並且應該返回其他值。

怎麼了?爲什麼它總是返回零?

我的懷疑:

也許我錯了,我不擅長C#,但我認爲,效率是始終爲零的原因,是因爲我在用它的數據庫,它是某種異步。當我調用這個變量時,它首先返回零,然後調用數據庫。

+0

在你的return語句行上放上一個斷點,然後讓我們知道db.Goals.Count()的值,HisGoals中是否還有任何值? –

+0

@SimonPrice正如我在我的問題所說,我試圖檢查調試器中的變量。 HisGoals.Count等於4,所有目標 - 11. – Piotrek

+0

我沒有看到你說你從哪裏得到你的價值。而不是把總和放在返回語句裏,把它放到一個變量中,就像'var result = HisGoals.Count/allGoalsInSeason;'你會得到一個有效的結果嗎? –

回答

0

我認爲你的問題在於除以整數/整數。爲了得到一個浮點數,你要投第一個漂浮這樣的:

public float Efficiency 
{ 
    get 
    { 
     using(var db = new ScoresContext()) 
     { 
      var allGoalsInSeason = db.Goals.Count(); 
      return (float)HisGoals.Count/allGoalsInSeason; 
     } 
    } 
} 

劃分INT/INT結果總是INT這是你的情況爲0(如果是,你在評論4/11說)。

第二件事是,實體框架將緩存值 - 測試它發貨前的生產。

+0

謝謝,現在它工作:)但是,你能解釋一下關於緩存值的最後一句話嗎?你什麼意思? – Piotrek

+0

你認爲在Model中以這種方式使用數據庫是個好主意嗎?我做對了嗎?你會怎麼做? – Piotrek

+1

我一直沒有廣泛使用EF一段時間,但我記得如果你在數據庫之間直接改變值,那麼調用EF可能不會觸及數據庫兩次。相反,它緩存價值,下一次可能會返回舊值。如果您有其他進程正在運行和更改數據,這可能會造成問題。不知道我是否正確。 – pg0xC