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 分层应用程序 - 在层之间共享实体数据模型的主要内容,如果未能解决你的问题,请参考以下文章