解决方案中的项目
我有一个典型的 3 层解决方案,它以 .NET 4.5 为目标并使用 Entity Framework 6 Alpha 3。该解决方案由三个项目组成,我们称它们为:
- 实体 - 包含 EF 模型和实体定义的类库
- DataAccess - 充当 UI 和数据库之间“业务层”的类库
- WinformsClient - Winforms 客户端应用程序
引用资料
WinformsClient 项目包含大量外部引用,包括对 CrystalReports DLL、其他“公司范围”程序集等的引用。
在我的 WinformsClient 中,我引用了我的 DataAccess 库。两者都使用实体库。
触发问题
在 WindowsClient 中,我调用了 DataAccess 库上的一个方法,我们称它为 GetData
.在这个方法中,一个 DbContext
被创建,一些 LINQ 魔术被执行并且一个 IEnumerable<T>
被退回。
问题
现在,一旦我第一次调用此方法,就会在调用第一个 LINQ 扩展方法时加载大量外部程序集。这包括需要很长时间才能加载的 CrystalReports DLL。 但这些程序集实际上都没有被 Entities 或 DataAccess 库引用,也没有一个是执行或显示数据所必需的。
事实上,当我创建一个引用 DataAccess 和 Entities 库的单独控制台应用程序时,我可以调用 GetData
并获得我的实体列表就好了,并且没有加载任何外部库。
我怀疑 Entity Framework/LINQ to Entities 与此有关,因为当我只是从 DataAccess 库返回 POCO 的列表(不加载 EF)时,没有加载任何外部引用。
谁能解释这种行为?
更新
这个问题可能与this question密切相关,其中 Entity Framework 尝试加载从项目引用的所有程序集。仍然欢迎任何有助于我理解为什么会发生这种情况/如何影响这种情况的建议!
最佳答案
问题不在 Entities 或 DataAccess 层上,显然,问题出在您的 WinformsClient 上。我的建议是在调用 GetData
方法的那一行设置一个断点,这显然在您的 WinformsClient 项目中。
从那里进入 GetData
方法并检查您的调用堆栈,也许您会在那里找到违规者。似乎调用 GetData
的方法正在被您的 WinformsClient 应用程序中的某些东西监视。 (obs:评论太长了)
关于c# - 这是如何运作的? LINQ to Entities 触发程序集加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15974203/