2013-03-30 117 views
0

我上課是這樣的:爲什麼我的通用列表始終爲空?

public class Lugar 
{ 
    [Key] 
    public int LugarId { get; set; } 


    public List<Review> Reviews { get; set; } 
    public int SumReviews { get; set; } 

    public double AverageReviews { get { 

     if (Reviews == null) 
      return 0; 

     else if (Reviews.Count == 0) 
      return 0; 

     else 
     return (double)SumReviews/(Reviews.Count); } } 


} 

而且在我的控制器我有這樣的:

[HttpPost, Authorize] 
    public ActionResult WriteReview(int id, FormCollection formCollection) 
    { 

     Lugar lugar = db.Lugares.Find(id); 
        Review review=new Review(); 
     review.User = User.Identity.Name; 
     review.Rating=Convert.ToInt32(formCollection["Rating"]); 
     review.Texto = formCollection["Review"]; 
     if (lugar != null) 
     { 
      if( lugar.Reviews==null) 
      lugar.Reviews=new List<Review>(); 

      lugar.Reviews.Add(review); 
      lugar.SumReviews += review.Rating; 
      db.SaveChanges(); 

     } 

     else 
      return RedirectToAction("Index"); 



     return RedirectToAction("Index"); 
    } 


} 

的問題是在該行:

如果(lugar.Reviews == NULL) lugar.Reviews = new List();

每次我執行我得到(lugar.Reviews == NULL)是真的.....

即使我已經加了審查那個地方,如果語句返回true .....

+0

用'new'在這種情況下細,比標記列表爲'virtual'(用於延遲加載)更好地手動創建列表更好地控制這隻會導致不正當的數據庫查詢。您無需從數據庫加載整個列表以添加新的子項。 – Slauma

+0

如果我每次創建新列表時都丟失了我的數據,我剛剛測試了 –

+0

「*丟失我的數據*」是什麼意思?您是否意味着已經存儲在數據庫中的評論被刪除?這不可能發生在你的問題的代碼... – Slauma

回答

2

嘗試使用'虛擬'關鍵字來聲明你的列表,看看你是否有更多的運氣。

+0

它工作的人... 爲什麼virtual關鍵字是必要的? –

+0

我找不到關於虛擬操作符的任何內容,您的意思是虛擬修飾符?你如何在這種情況下使用它,爲什麼? – Guffa

+0

現在我明白爲什麼虛擬是必要的.... 因爲如果我不使用虛擬關鍵字,我必須使用Eager加載或顯式加載,我沒有這樣做...... 我沒有加載我的列表。 ... –

0

你可能想在你的Lugar類中引入一個構造函數並在那裏實例化這個列表。 類似這樣的:

public void Lugar() 
{ 
    Reviews = new List<Review>(); 
} 

希望這會有所幫助。不要請讓我知道。

P.S.另一件與您的具體問題無關的事情,但肯定是一種改進是使用視圖模型而不是FormCollection。

它會以一種主要方式簡化您的生活。例如如何使用它,請看看這個成功解答的問題:What is ViewModel in MVC?

+0

仍然無法正常工作.... 看看行: else if(Reviews.Count == 0) return 0; 我總是得到Reviews.Count = 0即使我已經添加了評論... –

+0

我純粹回答您的初始問題,並且無法知道是這種情況?無論如何,如果你在你的評論中說,像我建議的那樣使用'new'關鍵字初始化列表比添加'virtual'關鍵字更好,你可能想重新考慮接受的答案......謝謝。 –

+0

初始化不幫我... 我仍然需要使用懶加載... 或我可以使用急切或顯式加載... 但該視圖模型帖子是有用的,thx無論如何 –

0

你有2個選擇這裏,延遲加載這會拉低你的第二個entitiy當你在查詢中使用.Include(/*lambda or string property name*/)語句訪問在C# 或預先加載的屬性(它是通過把虛擬的導航屬性啓用)。

我個人perfer預先加載,你有當實體加載

相關問題