2013-04-05 58 views
0

Asp.net MVC3應用程序數據訪問。可以說我有3張桌子;文章,類別和作者。變化的關係,以簡化在MVC3與實體框架

創建 Category.CategoryId之間的關係 - > Article.CategoryId和Author.AuthorId - > Article.AuthorId 使用代碼第一導航性能

public virtual Category Category { get; set; } 
public virtual Author Author { get; set; } 

這意味着,當我查看文章的列表我必須:

return View(db.Article 
      .Include(c=>c.Category) 
      .Include(a=>a.Author) 
      .ToList()); 

爲了訪問類別和作者的名字,而不只是它們的ID的

打破這個經典模式而不是創建這些表之間的關係會傷害多少?然後,我可以從ViewModel中的作者和類別表返回SelectLists,並直接使用相應的名稱而不是id來填充我的Article表中的Category和Author字段,並且還保持數據完整性。 我的查詢是隻簡化爲:

return View(db.Article.ToList()); 

我想我將不得不爲那些領域,以加快搜索索引。

這是能在別處做或者是完全錯誤的? 它有更好或更差的表現嗎?

回答

1

@Panos,你原來的做法是正確的,刪除​​外鍵將是一個錯誤。使用includes可以避免在這種情況下的延遲加載,並且你有很好的性能。

0
public virtual Category Category { get; set; } 
public virtual Author Author { get; set; } 

您將類別和作者定義爲虛擬,這意味着這些對象在查詢中不包含Include命令時不會加載。你的人在你的網格中使用一個選擇列表而不刪除這些關係,因爲這些關係在你的查詢中沒有包含命令的情況下沒有任何實際負載。

但要注意使用.ToList(),這將載入您的查詢的所有記錄以後就有可能成爲大數據量。

+0

其相反的,如果標記字段作爲虛擬您可以使用延遲加載 – 2013-04-05 10:14:56

+0

是,你能延遲加載虛擬對象使用包括命令和不包含命令的虛擬對象將不會加載。 – Rabolf 2013-04-05 12:10:40