多年来,我一直在 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 服务)的可能性很小。这将如何影响设计考虑,以及我在上面提出的一些问题?
很抱歉将许多问题捆绑在一起。如果我能得到所有这些问题的答案,那么希望这对我将来遇到的其他人有用。