2012-01-03 35 views
1

我想創建自己的基本網上商店,所以我查看了一下,最後選擇修改MVC音樂商店教程以適應我的需求。MVC音樂商店變體 - 「序列不包含任何元素」錯誤

我還處於早期階段,到目前爲止,我的版本與教程版本非常相似,但表格和關聯類除外。該教程有流派,專輯和藝術家 - 我有一個更簡單的產品和類別,我已經適應了我的項目,但我得到一個錯誤。

它只發生在StoreController \ Browse部分。當我嘗試並查看特定類別的所有項目,我得到一個System.InvalidOperationException「序列不包含任何元素」

在控制器中使用的代碼是:

public ActionResult Browse(string cat) 
{ 
var categoryModel = storeDB.Categories.Include("Products") 
    .Single(g => g.CatName == cat); 

return View(categoryModel); 
} 

和視圖看起來是這樣的:

@model TPATK_shop.Models.Category 

@{ 
    ViewBag.Title = "Browse"; 
} 

<h2>Browsing Category: @Model.CatName</h2> 

<ul> 
    @foreach (var product in Model.Products) 
    { 
     <li> 
      @product.ProdName 
     </li> 
    } 
</ul> 

我有我所有的類和實體設置爲如下:

namespace TPATK_shop.Models 
{ 
    public partial class Category 
    { 
     public int CategoryId { get; set; } 
     public string CatName { get; set; } 
     public string Description { get; set; } 

     public List<Product> Products { get; set; } 
    } 
} 

namespace TPATK_shop.Models 
{ 
    public class Product 
    { 
     public int ProductId { get; set; } 
     public int CategoryId { get; set; } 
     public string ProdName { get; set; } 
     public string Description { get; set; } 
     public decimal Price { get; set; } 
     public string ImageURL { get; set; } 

     public Category Category { get; set; } 
    } 
} 

namespace TPATK_shop.Models 
{ 
    public class TPATKStoreEntities : DbContext 
    { 
     public DbSet<Product> Products { get; set; } 
     public DbSet<Category> Categories { get; set; } 
    } 
} 

我一直在研究這個問題,我似乎找不到解決方案。我試過singleordefault,但我仍然得到錯誤。

我已經確認所有數據都存在於數據庫中,並且密鑰是正確的。

當我的項目激發起來,在Global.asax中的條目觸發下面的代碼來填充DB(用於測試目的 - 如在演練中詳述)

namespace TPATK_shop.Models 
{ 
    public class SampleData : DropCreateDatabaseAlways<TPATKStoreEntities> 
    //public class SampleData : DropCreateDatabaseIfModelChanges<TPATKStoreEntities> 
    { 
     protected override void Seed(TPATKStoreEntities context) 
     { 
      var categories = new List<Category> 
      { 
       new Category { CatName = "50's" , Description = "50's stuff" }, 
       new Category { CatName = "Weddings" , Description = "Wedding stuff" }, 
       new Category { CatName = "Dribble Bibs" , Description = "Dribble bibs for kids" }, 
       new Category { CatName = "Xmas" , Description = "Xmas stuff" }, 
      }; 

      new List<Product> 
      { 
       new Product { ProdName = "Headband 1", Description = "Des for headband 1", Category = categories.Single(g => g.CatName == "50's"), Price = 8.99M, ImageURL = "/Content/Images/placeholder.gif" }, 
       new Product { ProdName = "Headband 2", Description = "Des for headband 2", Category = categories.Single(g => g.CatName == "Weddings"), Price = 8.99M, ImageURL = "/Content/Images/placeholder.gif" }, 
       new Product { ProdName = "Headband 3", Description = "Des for headband 3", Category = categories.Single(g => g.CatName == "Dribble Bibs"), Price = 8.99M, ImageURL = "/Content/Images/placeholder.gif" }, 
       new Product { ProdName = "Headband 4", Description = "Des for headband 4", Category = categories.Single(g => g.CatName == "Xmas"), Price = 8.99M, ImageURL = "/Content/Images/placeholder.gif" }, 
       new Product { ProdName = "Headband 4", Description = "Des for headband 5", Category = categories.Single(g => g.CatName == "Xmas"), Price = 8.99M, ImageURL = "/Content/Images/placeholder.gif" }, 
      }.ForEach(a => context.Products.Add(a)); 
     } 
    } 
} 

有人能看到爲什麼我收到錯誤?任何幫助都會得到很大的迴應。

+0

從視圖中刪除你的foreach代碼片刻,並檢查'​​@ Model.CatName'和'@ Model.Products.Count()'顯示 – 2012-01-03 11:22:42

+0

Pankej - 我已經完成了你的建議,並且仍然出現錯誤。它甚至在它看到之前就打破了。 – 2012-01-03 11:36:54

+1

你現在得到什麼錯誤... – 2012-01-03 11:42:53

回答

3

這是因爲所提供的cat在數據庫中沒有匹配的記錄。如果沒有記錄,使用SingleOrDefault方法檢索實體,它將返回null

public ActionResult Browse(string cat) 
{ 
    var categoryModel = storeDB.Catagories.Include("Products") 
     .SingleOrDefault(g => g.CatName == cat); 

    if (categoryModel == null) 
     return RedirectToAction("Index"); 

    return View(categoryModel); 
} 

這也許就是MVC不能綁定一個值cat參數設置爲空的情況。因此,請檢查您是否傳遞了名爲cat的查詢字符串參數。

+0

嗨Erange - 我已經完成了你說var類別模型返回爲null。當我調試時,storeDB確實有數據,因此它看起來不會將數據傳遞給categoryModel。我能做些什麼來看看爲什麼會發生這種情況? – 2012-01-03 11:03:20

+0

@JimboJames你是否檢查'cat'參數是否有正確的值? – Eranga 2012-01-03 11:30:25

+0

價值貓是空的,我想你已經確定了這個問題。我該如何糾正呢?該值位於來自鏈接的網址中。 – 2012-01-03 11:40:53

1

存在導致錯誤的拼寫錯誤。您使用「Catagory」而不是「Category」。現在,由於您已經使用了POCO Code-first,因此有一個將Model名稱與數據庫表格進行復用的約定。由於沒有像「CATAGORY」這樣的詞,所以成功化失敗了。

若要使此錯誤正確,請將Catagory重命名爲類別,然後將類別更改爲DbContext類中的類別。

或者

可以裝飾你的產品類別類像下面

[Table("Catagories"] 
public class Catagory 

如果按照這種方法,改變拼寫從類別ID產品型號,以CatagoryId

+0

感謝您的回覆。我做了更改,但仍然收到錯誤消息。我將在主要問題中重新發布新代碼,看看我是否已經正確理解了你。 – 2012-01-03 10:56:49

+0

您需要了解約定。嘗試第二個選項,它更容易。首先需要您在所有地方進行更改 – 2012-01-03 10:58:39

+0

只要確保您使用Catagory,然後在每個地方使用它,並使用表屬性「Catagories」裝飾Catagory模型類。 **或**如果您將Categary更改爲Category,請確保它隨處變化,並將Catagories更改爲Categories .....您無需打開另一個問題。這是唯一的問題 – 2012-01-03 11:01:28

0

它看起來像你得到的例外,因爲使用單一的方法意味着你期望有一個類別返回,如果沒有,這是一個例外情況。

在這種情況下可能會發生這種情況,因爲您的種子代碼似乎也缺少每個類別對上下文的明確添加。

也可能有問題,因爲EF代碼優先系統嘗試根據屬性名稱匹配鍵。您有一個產品引用類別對象,但使用類別ID標識符(帶有「e」,而不是「a」)。

+0

關於拼寫錯誤,我認爲現在已經修復。至於播種錯誤 - 我該如何糾正? – 2012-01-03 11:39:10

+0

您可以像添加產品列表一樣添加類似的ForEach語句,以將每個類別添加到上下文中,例如.ForEach(c => context.Categories.Add(c))。我發現你現在已經發現了這個問題,所以這不會有幫助:-)但是,它可能會避免你在將來感到驚訝。 – Richard 2012-01-03 12:11:20