ASP.Net 分层应用程序 - 在层之间共享实体数据模型

Posted

技术标签:

【中文标题】ASP.Net 分层应用程序 - 在层之间共享实体数据模型【英文标题】:ASP.Net Layered app - Share Entity Data Model amongst layers 【发布时间】:2011-02-20 11:28:20 【问题描述】:

如何在我的 C# Web 应用程序的所有层之间共享自动生成的实体数据模型(生成的对象类),同时只授予数据层中的查询访问权限?这使用了典型的 3 层方法:数据、业务、演示。

我的数据层向我的业务层返回一个IEnumerable<T>,但我不能将类型 T 返回到表示层,因为我不希望表示层知道数据层的存在——这是实体框架所在的位置自动生成我的课程。

建议使用仅包含数据模型的单独层,但我不确定如何将数据模型与实体框架提供的查询功能分开。

【问题讨论】:

【参考方案1】:

如果您使用POCO entities (.NET 4+),那么这很容易(或者至少更容易)。有这种可能吗?

您可以像 Ben 所说的那样创建 DTO,但是您基本上是在简化和复制每个实体。如果您愿意,EF2 将创建“简化”实体并动态添加更改跟踪、延迟加载等。

否则答案是你不能。如果实体依赖于实体框架,那么您不能在整个应用程序中使用它们而不拖动该依赖项。在这种情况下,您必须使用 DTO。这是没有 POCO 实体的 EF 1 或 EF 2 的第 3 方选项。 http://automapper.codeplex.com/

编辑:以下是一些有用的链接,可帮助您了解更多信息:

    一般 MS 指南: http://msdn.microsoft.com/en-us/library/bb738470.aspx POCO 模板: http://blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx POCO 模板,包括如何 移动到单独的项目: http://blogs.msdn.com/adonet/pages/feature-ctp-walkthrough-poco-templates-for-the-entity-framework.aspx POCO 代理: http://blogs.msdn.com/adonet/archive/2009/12/22/poco-proxies-part-1.aspx 如何拆分模型: http://blogs.msdn.com/adonet/archive/2008/11/25/working-with-large-models-in-entity-framework-part-2.aspx 员工跟踪器示例应用程序 (层,单元测试,模拟, 存储库等): http://code.msdn.microsoft.com/ef4/Release/ProjectReleases.aspx?ReleaseId=4279

【讨论】:

@Nelson - 当我尝试调用从 DAL(从 BAL 调用)返回 IEnumerable 的函数时。我在构造函数 public MyEntities() 的 DataModel 中收到不正确的参数异常:base(连接字符串,容器名称) 好的,所以 MyEntities() 是你的 ObjectContext。您可以拥有多个对象上下文的实例,但您必须自己创建它。您应该能够执行类似var context = new MyEntities(); var employees = context.Employees.ToList(); 的操作,您是说它在new MyEntities() 处出现错误吗?它在抱怨哪个论点? @Chris:我想我知道你的问题是什么。该模型将创建一个连接字符串。如果您将它放在单独的类库中,它会将其添加到 app.config,但 DLL app.configs 永远不会被使用。您必须将其复制/粘贴到主应用程序的 app/web.config 注意<add name="connectionName" .../> 中的名称。 connectionName 必须在 *.Context.tt 模板生成的上下文文件中匹配(可以搜索public const string ConnectionString = "name= Hrmmm.. 上下文仅在我的每个 DAL 函数中创建和销毁。我认为当我尝试访问返回的内容时,它会因为上下文不再存在而崩溃。【参考方案2】:

您可以从您的数据实体创建 DTOs 并将您的 DTO 传递给表示层。

【讨论】:

对,但是由于数据层中已经存在 DTO(如果我错了,请纠正我),为什么我不能重用它......或者有一种简单的方法来自动生成来自数据实体的 DTO?我希望有一种方法可以自动执行此操作。 @Chris:EF 2(在 .NET 4 中)将使用 T4 模板“自动”创建“DTO 实体”。这些实体对 EF 没有任何依赖关系。然后,您可以将它们移动到单独的程序集以在 3 层之间共享,并且没有任何循环引用。 如果您至少有 Visual Studio 2010,则可以坚持使用 EF 1 并使用自定义 T4 模板为您生成 DTO。否则,我认为没有 3rd 方工具是不可能的。 要记住的另一件事...如果您使用 POCO 代理进行延迟加载,您将间接授予所有层“查询访问权限”。基本上,如果尚未加载数据并且您尝试访问该属性,它将在后台运行查询,而无需通过您的 DAL 方法。 @Chris:如果您想要任何“高级”功能,例如延迟加载和更改跟踪(不进行完整的对象比较),您必须保持代理处于开启状态。您可以在上下文文件的构造函数中单独关闭延迟加载。

以上是关于ASP.Net 分层应用程序 - 在层之间共享实体数据模型的主要内容,如果未能解决你的问题,请参考以下文章

Web开发的分层结构与MVC模式

[ASP.NET].NET逻辑分层架构总结

如何让asp.net成员提供者和实体框架共享同一个数据库

ASP.NET开发实战——ASP.NET MVC & 分层 代码篇

如何在 asp.net 中创建分层结构

n 分层架构中的实体框架 - 要遵循的最佳实践?