2011-03-21 54 views
3

我是新來的實體框架和mvc。
我想了解Controller應該傳遞給視圖的內容。
它應該是來自Models(MySolution.Models.Story)的類還是來自實體框架(MySolution.Story)的類。
問題是,如果我從實體框架中選擇一個,那麼DataTypes和html-helpers工作不正常。如果我選擇從模型類的話,我無法從實體類轉換成模型類,例如:我應該在控制器中使用實體框架類還是模型類?

TrendEntities TrendDB = new TrendEntities(); 
public ActionResult Details(int id) { 
    var Country = TrendDB.Countries.FirstOrDefault(c => c.CountryId ==id); 
    return View(Country); 
} 

回答

2

只需使用adp.net實體框架POCO模板來生成。下載模板。右鍵單擊實體設計器並選擇「添加代碼生成項目」並選擇poco模板。現在你的對象沒有全部的「實體框架包袱」。代理自動創建在幕後,不需要做任何對象映射。 您可以通過向Visual Studio 2010添加新項目並從POCO的添加對話框中搜索在線模板來找到此模板。模板名稱是:

ADO.NET C#POCO實體生成器

+0

從你的評論我發現我弄糟了框架和幕後發生的一切......現在情況正在好轉。 – Stavros 2011-03-21 21:43:22

2

您正在尋找要麼AutoMapperValueInjecter。這兩個庫是「Object to Object」映射器,用於將值從一個對象映射到另一個對象。我以前只使用過AutoMapper。拿起來很好,很容易。我也聽到了有關ValueInjecter的好消息。

+0

我不能在沒有外部庫的情況下執行此操作嗎?我認爲在我的設計中可能存在問題,因爲我在這裏面臨的問題必須是非常微不足道的。 – Stavros 2011-03-21 15:41:04

+0

@Strarvos - 您始終可以自己執行從左到右的映射代碼。 – jfar 2011-03-21 16:03:57

+0

是的,jfar是對的 - 你可以自己動手。這些工具加速了這一過程。 – smartcaveman 2011-03-21 16:08:01

0

使用ViewModel。這是一個你聲明擁有你想在視圖中顯示的屬性的類。

例如:

var country = TrendDB.Countries.FirstOrDefault(c => c.CountryId == id); 

CountryDetails details = new CountryDetails(); 
details.FirstValueToShow = country.Name; 
return View(details); 

切記強類型的詳細信息視圖的視圖模型。

+0

正如我所料,你並不需要這樣做,但它是一個設計問題 – Stavros 2011-03-21 17:19:56

2

經過一番調查,我發現我有一個設計問題。 長話短說,記得在MVC 3,我們需要定義下面的類模型

public class StoryDBContext : DbContext 
{ 
    public DbSet<Story> Stories {get; set;} 
} 

然後在控制器的訪問實體框架時要使用的一個。

在之前的版本中,我們沒有定義上述類,而是使用TrendEntities類(由框架創建)來訪問數據庫。 這有點令人困惑...... 因此,在我的示例中,趨勢數據庫應該是StoryDBContext類型而不是TrendEntities,並且事情按預期工作。

+0

不,它不是:( – Stavros 2011-03-21 20:38:49

相關問題