Asp.net mvc 3 在实体框架中使用数据库优先的方法
我对MVC和EF都是新手。在我们的应用程序中,我们使用数据库优先的方法。当我们使用DB-first方法时,我们从DB生成edmx 当我生成edmx时,它会为数据库中的表生成所有相关的类。在这里,我很困惑是直接在视图中使用生成的类,还是应该在EF生成的类的基础上再创建一层类,然后从控制器和视图中使用它们 如果我要在实体上再创建一层类,我必须处理这些类之间的映射。如果模型有任何变化,我怀疑这可能是未来的痛苦 如果我直接使用控制器中的实体,我会觉得我正在将所有不必要的东西暴露给控制器和视图Asp.net mvc 3 在实体框架中使用数据库优先的方法,asp.net-mvc-3,entity-framework,c#-4.0,orm,asp.net-mvc-4,Asp.net Mvc 3,Entity Framework,C# 4.0,Orm,Asp.net Mvc 4,我对MVC和EF都是新手。在我们的应用程序中,我们使用数据库优先的方法。当我们使用DB-first方法时,我们从DB生成edmx 当我生成edmx时,它会为数据库中的表生成所有相关的类。在这里,我很困惑是直接在视图中使用生成的类,还是应该在EF生成的类的基础上再创建一层类,然后从控制器和视图中使用它们 如果我要在实体上再创建一层类,我必须处理这些类之间的映射。如果模型有任何变化,我怀疑这可能是未来的痛苦 如果我直接使用控制器中的实体,我会觉得我正在将所有不必要的东西暴露给控制器和视图 有人能告诉
有人能告诉我如何继续吗?您可能想使用NuGet安装一个POCO(普通的旧C#对象-不依赖于其他功能(如EF)的对象)生成器,这样您就可以将对象传递到视图层,而不需要查看层了解EF 这被称为“关注点分离”或“单一责任原则”——您的视图知道如何显示数据,您的DAL知道如何检索和存储数据,并且两者都不必知道有关执行其他工作的细节 如果您将EF对象传递到链的上游,那么您还需要将EF知识和能力传递到链的上游-传递POCO会绕过这一点 请看一下这个SO主题:
你做得很好,就凭你拥有的方式,你不需要改变它。您应该能够使用生成的类,或者如果您认为您公开的内容太多,您可以创建一个视图模型,只填充您关心的数据,并将其传递给视图。这就是MVC的工作原理 假设您有一个名为
Articles
的数据库表,其中有很多内容您不想传递给视图,您可以创建这样的视图模型
public class ArticlesViewModel
{
[Required] // this is optional, just to give you an idea of validation
public string Title { get; set; }
public DataTime Date { get; set; }
}
现在,在控制器中,您将有如下内容:
ArticlesViewModel articleVM = new ArticlesViewModel();
// populate it from your DB
return View(articleVM);
因此,现在您的视图只有标题
和日期
,(您还应该有ID
,这样您就可以轻松地从数据库中检索完整的文章
)
这将使您了解如何从数据库中获取所需信息。据我所知,在代码优先的方法中,我们使用POCO。如果我错了,请纠正我。通过安装POCO生成器,您可以在Database First项目中使用POCO-我有几个主要的项目是这样做的。EF4.x DBContext generator与POCO generator类似吗?因此,除了Articles类外,您还有ArticlesViewModel类,并且您将模型类公开给视图。在第一步检索数据时,您将获得文章,并从文章中检索ArticlesViewModel。如果我错了,请更正。是的,请查看默认MVC3应用程序中的
AccountModels.cs
。这些仅公开用户可以看到和更改的信息。然后在一篇文章中,它更新了成员资格表。会员资格包含的属性远不止用户名、密码等。希望对您有所帮助。看见