【问题标题】:ASP.NET MVC4 with Entity Framework带有实体框架的 ASP.NET MVC4
【发布时间】:2013-05-13 19:09:23
【问题描述】:
我正在设计一个带有 MVC4 Web 应用程序的 ASP.NET,用于为不同客户提供不同数据库的多租户应用程序。
我打算使用实体框架,由于我是新手,假设我遵循数据库优先模型,我有以下问题。
是否还需要生成 EDMX 文件?也就是说,EDMX中生成的实体模型是否足够,还是需要再创建一层实体模型映射到数据库中?
实体概念模型应该驻留在我的应用程序架构中的什么位置?我可以将所有模型(数据库模型、视图模型)放在一个单独的项目中吗?
【问题讨论】:
标签:
asp.net-mvc
entity-framework
【解决方案1】:
多租户将是具有父“客户”对象或类似对象的同一数据库,您是否正在构建多实例应用程序(不确定它是否与您的问题相关,但重要区别取决于您如何部署应用程序)?
尽可能简单地回答您的其他问题:
- 是的,您需要生成数据模型,并且可以将它们放在您想要的任何位置。这可能足以满足您的需求,但通常您还需要构建一些自定义视图模型。
- 如果您需要多个项目来访问相同的模型,并且只想在一个地方维护它们,请将它们提取到自己的项目中。如果整个应用程序将包含在一个项目中,只需将其放入“模型”文件夹即可。
【解决方案2】:
从与 NHibernate 和 EF 竞争获得“不信任投票”的日子开始,Entity Framework 已经走过了漫长的道路。 4.x 改变了你最终的选择,不幸的是很多文章都引用了 4.x,所以当你使用 MVC 4 时,你很可能会取消 5.0 版本,并且一些示例并不那么有趣启动并运行。
Julie Lerman 写了很多关于 EF、Dbcontex、EF Code First 的书籍。
您可以跳过创建 EDMX 文件,这样做的利弊。如果你是核心程序员,你想开发 POCO 类,然后将其连接到你的数据库,这很好。或者,您可以使用 EDMX。您可以先使用模型、迁移等变体......
Code First is for both flexibility of whether you have an existing database or do not have a database.
我个人喜欢有很多项目,对我来说,替换“DAL”的是 ProjectName.Data 项目,查看存储库模式(最终是工作单元模式)。
您不希望将业务逻辑和代码渗入您的控制器。 SRP(单一责任原则)让你的控制器保持精简。互联网上的 Nerddinner 和其他一些 MVC 项目试图建立一个体面的结构。 MusicStore http://mvcmusicstore.codeplex.com/ 和 Contoso http://contosontiermvc.codeplex.com/ 尽管它们具有 mvc3 主要结构,但您将深入了解如何构建数据。
【解决方案3】:
您可以通过尝试从现有数据库创建实体框架来从数据库生成。 (我认为您可以右键单击新模型的表面并从数据库生成)
他们可以驻留在不同的项目中,是的
【解决方案4】:
EDMX文件还需要生成吗?
我可能误解了您的问题,但是如果您创建了数据库,并且您想使用 EF Database First 技术访问它,那么您需要生成实体框架模型(EDMX)才能使用 EF 访问数据库。但是您将从数据库中生成它。有一种模型优先技术,这是您不想想做的事情。
还有另一种选择,可以先使用代码,而不是先使用数据库,并且可以生成流畅的映射,而不是生成 EDMX。本质上是对代码优先模型进行逆向工程。这是我所知道的在没有 EDMX 的情况下使用 EF 访问数据库的唯一方法。
实体概念模型应该驻留在我的应用程序架构中的什么位置?我可以将所有模型(数据库模型、视图模型)放在一个单独的项目中吗?
我通常在类库中有我的 EF 模型(实体模型),无论它们是 EDMX 还是 Code first。这使我可以在可能访问同一数据库的项目中重用该库。
我的 ViewModel 位于 MVC 项目的 Models 文件夹中,因为它们特定于 MVC 项目中的视图。
很多人都有另一层,通常是具有 GetPerson、GetOrder、GetOrders 等函数的类,它们允许您调用并处理查询实体模型,或者可能返回 IQueryable 以允许您的 MVC 项目添加附加标准。该层可能也可能不会从查询中填充 ViewModel。有很多变化。您可以阅读“存储库模式”。我个人强烈建议您在使用 EF 和 MVC 一段时间之前不要实现这一层。这样你就可以开始看到什么是多余的,或者让你的控制器变得杂乱无章,这将帮助你更好地衡量你想要使用的存储库模式的哪些变体。如果您没有经历过它所解决的问题,就很难正确采用一种模式。