【发布时间】:2013-12-06 05:24:37
【问题描述】:
我一直在使用 PHP ORM,有趣的一点是,由于是一种动态语言:在数据访问层中,我向 DB 发出请求,它返回一个“通用”对象(数组的好名字! ) 我在整个应用程序中将它用作我的实际 模型,直接在控制器和视图上!这让强类型场景感到惊讶!
现在在 C# 中,使用实体框架作为我的 ORM,它有自己的自动生成模型(实体),我在这里提出了一个问题:
Dal (with Entity Framework) and Model layers into MVC
结论是:在应用程序中使用这些 EF 的实体作为我的实际模型层是错误的,所以我需要获取这些数据层模型并转换为模型层中真正的应用程序模型......在我的控制器、视图中处理从数据库接收到的数据。
此外,我们还有一些非常棒的问题对我有所帮助:
- Entity Framework in Layered Architectures
- In MVC, does an ORM represent the model?
- Entity framework and Business Layer / logic
但我正在重新考虑在数据层中使用 EF,为什么? Entity Framework 中可爱的东西是 DbContext,基本上所有 ORM 都围绕它工作,如果我将这些 EF 的实体转换为我的模型层模型,我将浪费所有使事情变得更容易和更快的好东西,除了转置真正让我烦恼并使事情变得更难的类的辛勤工作!(请不要说 AutoMapper,我不能在我的工作中使用它,而且我不是在寻找第三方解决方案)。
为什么在模型层或单层中使用实体框架更快:
我会在模型层中拥有所有自动生成的模型,并且我 可以在我的整个应用程序中使用它们,我也会充分利用 使用 DbContext 的所有实体框架,快速简单。
但是,这让我感到害怕,因为我会直接在非数据层中访问数据,而 Controller 和 View 可以访问所有与数据相关的内容,而且我们都知道这种方法存在的问题。
所以我的问题是:
我假设 ORM 是为了让数据访问开发更容易、更快捷,就像我可以用 PHP 做的那样简单,而且效果很好。另外,我认为这对于敏捷开发来说是完美的,因为使用存储过程进行小型和快速的工作是一种痛苦(尽管我喜欢 SP)。所以这里是 Entity Framework 和 DbContext 让事情变得更容易和更快,对吧?但是,敏捷开发根本不会打成一片,所以这就是为什么在所有问题中我们都在谈论将 EF 放在数据层而不是模型层中。
但这会使使用 EF 的开发变得更慢和痛苦,我们浪费了它的优势,而且严重的是,在这种情况下使用存储过程会更快。 在分层架构中使用 EF 并没有真正快速的开发?
【问题讨论】:
-
automapper 之类的工具使从实体到视图模型的转换相对较快。我不接受你问题的前提。
-
好吧,如果它对你有用,但你不知道我不能使用它的场景,我有权提出另一个解决方案的问题,好吗?你可以对我的问题做-1,但你很自私
-
@Maess AutoMapper 绝对不是解决所有架构问题的灵丹妙药。 AutoMapper 实际上会生成糟糕的自动生成的 ViewModel,其中包含许多您不想向控制器公开的实体属性。我希望我可以对您的评论投反对票。
-
完全不正确,它只会映射模型中存在的属性。我不建议基于实体自动生成视图模型。
-
在我们的项目中,我们使用 T4 代码生成和 DataObject.Net ORM(代码优先)。我们生成模型的扩展并用它完全生成视图模型。因为我们有可以将模型中的所有元数据获取到我们的模板中的类,所以我们可以生成任何东西。举个例子:我们还为 Kendo UI 视图生成 DataSources 和 DataModels。我们已经为我们的传统实现了第二个实现,它使用 LINQ to SQL。模型中的任何更改都会立即反映在所有层中,并且可以在任何视图上使用。我们的 ORM 就是模型。
标签: c# asp.net-mvc entity-framework orm