【问题标题】:Using Database first approach in Entity Framework在实体框架中使用数据库优先方法
【发布时间】:2012-08-10 10:12:33
【问题描述】:

我是 MVC 的新手,也是使用 EF 的新手。在我们的应用程序中,我们使用数据库优先方法。由于我们使用的是 DB first 方法,因此我们从 db 生成 edmx。

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

如果我在实体之上再创建一层类,我必须处理这些类之间的映射。如果模型发生任何变化,我怀疑这可能会成为未来的痛苦。

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

有人可以告诉我如何进行此操作吗?

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework c#-4.0 orm asp.net-mvc-4


    【解决方案1】:

    你已经做得很好了,你不需要改变它。您应该能够使用生成的类,或者如果您认为暴露太多,您可以创建一个视图模型,您将只填充您关心的数据并将其传递给视图。这就是 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);
    

    所以现在您的视图只有TitleDate,(您还应该有ID,这样您就可以轻松地从数据库中检索完整的Article。)

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

    【讨论】:

    • 因此,除了 Articles 类之外,您还有 ArticlesViewModel 类,并且您正在公开模型类以供查看。在第一步检索数据时,您将获得文章并从文章中检索 ArticlesViewModel。如果我错了,请纠正我。
    • 是的,看看默认 MVC3 应用程序中的 AccountModels.cs。这些仅公开用户可以查看和更改的信息。然后在一个帖子上,它更新了Membership(我认为)表。会员资格包含更多的属性,而不仅仅是用户名、密码等。希望对您有所帮助。见asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/…
    【解决方案2】:

    您可能希望使用 NuGet 安装 POCO(普通旧 C# 对象 - 不依赖于其他功能(例如 EF)的对象)生成器之一,这样您就可以将对象传递到视图层而无需视图层完全了解 EF。

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

    如果你将 EF 对象向上传递,那么你还需要将 EF 知识和能力向上传递——传递 POCO 绕过了这一点。

    看看这个 SO 主题:

    Entity Framework 4 / POCO - Where to start?

    【讨论】:

    • 据我所知,我们在 Code First 方法的情况下使用 POCO。如果我错了,请纠正我。
    • 通过安装 POCO 生成器,您可以在 Database First 项目中使用 POCO - 我有几个主要项目是通过这种方式完成的。
    • EF4.x DBContext 生成器是否类似于 POCO 生成器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多