2012-08-10 92 views
5

我是MVC的新手,并且使用EF是新手。在我们的应用程序中,我们使用数据库优先方法当我们使用数据库第一种方法时,我们正在从数据库中产生edmx。在实体框架中使用数据库第一种方法

当我生成edmx时,它会为我的数据库中的表生成所有相关的分类。在这里,只是我很困惑是直接在视图中使用生成的分类,还是应该在EF生成的分类之上创建一个更多层的类,并使用它们从我的控制器和视图中进行分类。

如果我在实体之上再创建一层类,我必须注意这些类之间的映射关系。如果模型有任何改变,我怀疑未来这可能是一种痛苦。

如果我直接使用我的控制器中的实体,我觉得我将所有不必要的东西暴露给控制器和视图。

有人可以请教我如何着手吗?

回答

3

你正在做的罚款只是你如何拥有它,你不需要去改变它。你应该能够使用生成的类,或者如果你认为你暴露的太多,你可以创建一个视图模型,你将只填充你关心的数据并将其传递给视图。这就是MVC应该如何工作。

假设你有一个数据库表叫Articles并且在出现了很多的东西,你不wan't传递给视图,您可以创建这样

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); 

所以,现在你的观点仅具有TitleDate(你也应该有ID这样你就可以检索完整从数据库很容易。)

This会给你一个想法,只是从您的数据库中获取所需的信息。

+0

所以除了Articles类,你有ArticlesViewModel类,你正在暴露模型类来查看。在第一步中回顾数据时,您将获得文章,并从文章中检索ArticlesViewModel。如果我错了,请纠正我。 – Naresh 2012-08-10 11:11:47

+0

是的,请查看默认MVC3应用程序中的'AccountModels.cs'。这些只会暴露用户可以看到并更改的信息。然后在一篇文章中,它更新了'Membership'(我认为)表格。成员包含更多的属性,而不仅仅是用户名,密码等希望有所帮助。请参阅http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/adding-a-model – 2012-08-10 11:43:04

2

您可能想要使用NuGet安装POCO(普通旧C#对象 - 对其他功能(例如EF)没有依赖关系的对象),以便您可以将对象传递到View层而不需要View层需要知识的EF。

这被称为“关注点分离”或“单一责任原则” - 您的视图知道如何显示数据,您的DAL知道如何检索和存储数据,也不应该知道关于做其他工作。

如果您将EF对象向上传递链,那么您还需要将EF知识和能力传递给链 - 传递POCO绕过此。

看看这个话题SO:

Entity Framework 4/POCO - Where to start?

+0

据我所知,我们在代码优先的情况下使用POCO。如果我错了,请纠正我。 – Naresh 2012-08-10 10:37:40

+0

通过安装POCO生成器,您可以在Database First项目中使用POCO - 我有几个主要项目以这种方式完成。 – Moo 2012-08-10 10:38:54

+2

EF4.x DBContext生成器与POCO生成器类似吗? – Naresh 2012-08-10 10:52:18

相关问题