Asp.net mvc 我应该在控制器中使用实体框架类还是模型类?

Asp.net mvc 我应该在控制器中使用实体框架类还是模型类?,asp.net-mvc,asp.net-mvc-3,entity-framework,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,我不熟悉实体框架和mvc。 我试图理解控制器应该传递给视图的内容。 它应该是模型MySolution.Models.Story中的类,还是实体框架MySolution.Story中的类。 问题是,如果我从实体框架中选择一个,那么数据类型和html帮助程序就不能正常工作。如果从模型中选择类,则无法从实体类转换为模型类,例如: TrendEntities TrendDB = new TrendEntities(); public ActionResult Details(int id) {

我不熟悉实体框架和mvc。 我试图理解控制器应该传递给视图的内容。 它应该是模型MySolution.Models.Story中的类,还是实体框架MySolution.Story中的类。 问题是,如果我从实体框架中选择一个,那么数据类型和html帮助程序就不能正常工作。如果从模型中选择类,则无法从实体类转换为模型类,例如:

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

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

您正在寻找或。这两个库是对象到对象映射器,用于将值从一个对象映射到另一个对象。我以前只使用过AutoMapper。这是伟大的,很容易拿起。我也听说了ValueInjector的优点。

使用ViewModel。这是一个您声明具有要在视图上显示的属性的类

例如:

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

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

请记住在ViewModel中强烈键入详细信息视图。

经过一些调查,我发现我有一个设计问题。 长话短说,请记住,在MVC3中,我们需要在模型中定义以下类

public class StoryDBContext : DbContext
{ 
    public DbSet<Story> Stories {get; set;}
}
然后在访问实体框架时要使用的控制器中

在以前的版本中,我们没有定义上述类,而是使用框架创建的TrendEntities类来访问DB。 这有点让人困惑。。。
因此,在我的示例中,TrendDB应该是StoryDBContext类型,而不是TrendEntities类型,并且一切正常。

只需使用adp.net实体框架POCO模板即可生成。下载模板。在实体设计器中单击鼠标右键,选择“添加代码生成项”,然后选择poco模板。现在,您的对象没有所有的“实体框架行李”。代理是在后台自动创建的,您不需要进行任何对象映射。 您可以通过向visual studio 2010添加一个新项目,并从POCO的“添加”对话框中搜索联机模板来找到此模板。模板名称为:


ADO.NET C POCO实体生成器

如果没有外部库,我不能执行此操作吗?我认为我的设计可能有问题,因为我在这里面对的一定很琐碎。@Strarvos-你可以自己做从左到右的映射代码。是的,jfar是对的-你可以自己做。这些工具加快了这一过程。正如我所料,你实际上不需要这样做,但这是一个设计问题。从你的评论中,我发现我把框架和幕后发生的一切都搞砸了。。现在情况好转了。。