1

我正在为具有不同数据库的多租户应用程序设计一个带有 MVC4 Web 应用程序的 ASP.NET,以供不同的客户使用。

我打算使用实体框架,由于我是新手,假设我遵循数据库优先模型,我有以下问题。

  1. EDMX文件还需要生成吗?换句话说,EDMX中生成的实体模型是否足够,还是需要创建另一层实体模型并将其映射到数据库?

  2. 实体概念模型应该驻留在我的应用程序架构中的什么位置?我可以将所有模型(数据库模型、视图模型)放在一个单独的项目中吗?

4

4 回答 4

1

多租户将是与父“客户”对象或类似对象相同的数据库,您是否正在构建多实例应用程序(不确定它是否与您的问题相关,但基于您如何部署应用程序的重要区别)?

尽可能简单地回答您的其他问题:

  1. 是的,你需要生成你的数据模型,你可以把它们放在你想要的任何地方。这可能足以满足您的需求,但通常您也希望构建一些自定义视图模型。
  2. 如果您需要多个项目来访问相同的模型,并且您只想在一个地方维护它们,请将它们提取到自己的项目中。如果整个应用程序将包含在单个项目中,只需将其放入“模型”文件夹即可。
于 2013-05-13T19:16:48.597 回答
1

从与 NHibernate 和 EF 竞争获得“不信任票”的日子开始,实体框架已经走过了漫长的道路。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 主要结构,但您将深入了解如何构建数据。

于 2013-05-13T23:42:46.050 回答
0
  1. 您可以通过尝试从现有数据库创建实体框架来从数据库生成。(我认为您右键单击新模型的表面并从数据库生成)

  2. 他们可以驻留在不同的项目中,是的

于 2013-05-13T19:14:51.033 回答
0

EDMX文件还需要生成吗?

我可能误解了您的问题,但是如果您创建了数据库,并且您想使用 EF Database First 技术访问它,那么您需要生成实体框架模型(EDMX)才能使用 EF 访问数据库。但是您将从数据库中生成它。有一种模型优先技术,这是你不想做的。

还有一个选择,不是先使用数据库,而是先使用代码,而不是生成 EDMX,而是生成流利的映射。本质上是对代码优先模型进行逆向工程。这是我所知道的使用 EF 在没有 EDMX 的情况下访问数据库的唯一方法。

实体概念模型应该驻留在我的应用程序架构中的什么位置?我可以将所有模型(数据库模型、视图模型)放在一个单独的项目中吗?

我通常在类库中有我的 EF 模型(实体模型),无论它们是 EDMX 还是 Code first。这使我可以在可能访问同一数据库的项目中重用该库。

我的 ViewModel 位于 MVC 项目的 Models 文件夹中,因为它们特定于 MVC 项目中的视图。

很多人还有另一层,通常是具有 GetPerson、GetOrder、GetOrders 等函数的类,这些函数允许您调用并处理查询实体模型,或者可能返回 IQueryable 以允许您的 MVC 项目添加其他条件。该层可能也可能不会从查询中填充 ViewModel。有很多变化。您可以阅读“存储库模式”。我个人强烈建议您在使用 EF 和 MVC 一段时间之前不要实现这一层。这样你就可以开始看到什么是多余的,或者让你的控制器变得杂乱无章,这将帮助你更好地衡量你想要使用的存储库模式的哪些变体。如果您没有经历过它所解决的问题,就很难正确地采用一种模式。

于 2013-05-13T19:25:50.617 回答