2014-02-28 198 views
1

我目前正在嘗試開發我的第一個.NET MVC應用程序,因此學習了主要概念。實體框架導航屬性

在我的應用程序中,我有一個表格顯示動物表中的動物列表。在表格中,我也試圖展示動物品種,但我從動物表中存儲的外鍵中拔出品種表enter image description here

我正在嘗試使用導航屬性來顯示品種文本,而不是ID,所以我 改變了我的動物模型,看起來像這樣

public partial class Animal 
{ 
    public int AnimalId { get; set; } 
    public Nullable<int> UserId { get; set; } 
    public string TagNo { get; set; } 
    public Nullable<int> Species { get; set; } 
    public Nullable<bool> Sex { get; set; } 
    public Nullable<int> AnimalBreed { get; set; } 
    public Nullable<System.DateTime> DOB { get; set; } 
    public Nullable<int> OwnershipStatus { get; set; } 
    public Nullable<System.DateTime> DateAdded { get; set; } 
    public Nullable<bool> BornOnFarm { get; set; } 

    public virtual Breed Breed { get; set; } 
} 

我的養殖模式看起來像

public partial class Breed 
{ 
    public int id { get; set; } 
    public Nullable<int> SpeciesID { get; set; } 
    public string Breed1 { get; set; } 
} 

在我看來,我想從我的動物顯示的品種領域模型a S下顯示,但該品種列就是一句

<td> 
    @Html.DisplayFor(modelItem => item.Breed.Breed1) 
</td> 

也終於,這裏是我使用的模型發送到視圖

List<Animal> Animal1 = (from animals in db.Animals 
    where animals.Species == 2 && animals.OwnershipStatus == 1 
    && animals.UserId == WebSecurity.CurrentUserId 
    select animals).ToList(); 

return View(Animal1); 

回答

0

如果延遲加載是不是代碼在您的DbContext中啓用,那麼您必須顯式加載(或使用急切加載)導航屬性。

http://msdn.microsoft.com/en-us/data/jj574232.aspx

最終你會-了類似:

var res = (from animals in db.Animals.Include("Breeds") 
            where animals.Species == 2 & animals.OwnershipStatus == 1 
            & animals.UserId == WebSecurity.CurrentUserId 
            select animals).ToList(); 
+0

我仍然不知道如何「加載」我上面的查詢。我必須將「包含」納入選擇? – user2437588

+0

@ user2437588是的,請參閱編輯 – ken2k

4

首先,不要以複數的單品。它在你的代碼創建的困惑:

public virtual Breed Breed { get; set; } 

- 或 -

public virtual ICollection<Breed> Breeds { get; set; } 

virtual屬性允許延遲加載(查詢獲取的品種會發出第一次嘗試訪問它) 。您幾乎總是希望將virtual與屬性包含在一起,以便實體框架不會不必要地發出連接(如果您實際上並未最終使用該屬性)。但是,在這種情況下,您,所以您需要通過在查詢中包含.Include("Breed")來通知EF急切加載它。但是,這只是爲了優化;這不是你的問題。

你的問題在於,剃刀不知道如何顯示Breed。顯然,這不是一種正常類型,因爲您創建了它。所以,你真正需要的是對Breed顯示實際的屬性,你想:

@Html.DisplayFor(m => m.Breed.Breed1) 

還有另一種方法,但它更復雜,可能是矯枉過正的這種情況。如果您確實想直接使用Breed,則需要爲Breed定義顯示模板。您可以通過添加一個名爲DisplayTemplatesViews\Shared新文件夾來實現。在該文件夾中,添加名爲Breed.cshtml的視圖。這裏的視圖的名稱對應於類的名稱,而不是屬性名稱。內部的看法,你會做這樣的事情:

@model Namespace.To.Breed 
@Html.DisplayFor(m => m.Breed1) 

然後,在你看來,你可能只是這樣做:

@Html.DisplayFor(m => m.Breed) 

與剃刀將使用顯示模板來呈現適當的事情。就像我說的那樣,這對於這件事來說太過分了,但是在更復雜的對象渲染中,它可能派上用場。

+0

嗨克里斯。感謝您的幫助,但我仍然沒有解決這個問題。我修改了我的代碼並調整了上面的問題以反映它。接受你的建議後,我仍然遇到同樣的問題。它仍然顯示一個空白欄。我做錯了什麼?謝謝 – user2437588

+0

你確定'Breed1'其實不是空白的?你的實體沒有任何要求,所以它可以非常容易地爲NULL或空字符串。 –

+0

我剛剛檢查過我的Breed表格,所有行中的所有列都包含數據? – user2437588