多年来,我一直在 ASP.Net 环境中使用 LINQ to SQL。UI 和 BLL 层由 Web 服务分隔,因此延迟加载、更改跟踪等不是一个选项。这在某种程度上很好,因为我们确切地知道代码中发生了什么——我们负责在 BLL 中持久更改(确定实体是否是新的/更新的),并且由于一些懒惰而没有意外的惊喜——加载在某处进行。
我现在已经转移工作并使用新的桌面系统 (WPF)。没有边界,即UI 层将直接调用 BLL(但请参阅最后的警告)。我正在寻找使用 EF5,但我对 EF 提供的功能、选项等的数量有点不知所措。我希望我能回答几个问题...
是否应该跨边界使用延迟加载?假设我想显示一个客户和他们的所有订单,UI 是否会只从 BLL 请求客户,然后使用延迟加载来访问其订单?在 UI 中执行此操作对我来说并不合适。我假设延迟加载只是您将在 BLL 中使用的东西。
我相信您可以使用 关闭延迟加载
DbContext.Configuration.LazyLoadingEnabled,但是如果我想在我的 BLL 中使用延迟加载,但是当我将实体返回到我的 UI 时,我不希望 UI 进行任何延迟加载怎么办?变更跟踪、自我跟踪实体和 POCO 怎么样?我应该在什么时候使用?当我使用 LINQ to SQL 时,这对我来说从来都不是问题(它跨越 Web 服务和 ASP.Net,因此没有“状态”,因此更改跟踪无关紧要)。我觉得我想全部停用它(这是我习惯的),但我担心我会错过一些 EF 的“优点”。我想我担心无法控制持久数据。
当我一直在使用 EF 进行操作和检索数据时,我注意到在一些实体层次结构中,一些属性集合(例如 customer.Orders)包含“代理”实体。这些是什么,它们什么时候有用?
我再次注意到您可以通过 关闭代理
DbContext.Configuration.ProxyCreationEnabled,但文档表明它还有更多功能,并且与 LazyLoadingEnabled 设置有某种关系?EF“代码优先”似乎越来越受欢迎。它给了你什么?我习惯于在 SSMS 中设计我的数据库,而不是编写大量的类、注释等!
最后一个警告 - 虽然应用程序的 UI 层直接调用 BLL 中的方法,但将来我们可能希望将它们分开(例如通过 Web 服务)的可能性很小。这将如何影响设计考虑,以及我在上面提出的一些问题?
很抱歉将许多问题捆绑在一起。如果我能得到所有这些问题的答案,那么希望这对我将来遇到的其他人有用。