【问题标题】:Adding custom navigation properties using SPs in .NET Entity Framework 4在 .NET Entity Framework 4 中使用 SP 添加自定义导航属性
【发布时间】:2010-07-16 13:58:01
【问题描述】:

我的公司对所有 SELECT 操作都使用存储过程,因此我很难创建合理的导航属性。在这一点上,我不太关心它们是否延迟加载。

例如,我为客户创建了一个实体,然后创建了一个 FunctionImport 来映射 GetAllCustomersSP 以返回客户实体的集合。但我想要每个客户实体上的导航属性“订单”。

但是如果我使用 Customer 实体分部类来添加这个属性,问题是我无法访问原始 Context,所以我无法显式或延迟调用 GetCustomerOrdersSP。

我能看到的唯一选择是修改我的存储库以显式添加这些属性,这似乎很蹩脚,因为它将实体逻辑放入存储库。

这里有什么我遗漏的吗?我可以在实体模型设计器中看到我可以指定自定义插入、更新、删除 SP,但我没有看到任何使用选择 SP 来实际检索数据的方法。

【问题讨论】:

  • 有人对此有见解吗?
  • 将 SP 与 ORM 结合使用并不是一个理想的情况,当您仅限于使用 SP 时,有时最好遵循更传统的 DTO 数据策略...

标签: c# entity-framework stored-procedures ado.net


【解决方案1】:

我同意 Tim 的观点……您提出的任何解决方案都不会充分利用 ORM,并且将成为维护的潜在噩梦。我建议在代码中创建一个模型,该模型以您想要开发的方式构建。

在应用程序的数据访问层中,您可以映射使用 SP 来补充模型对象的数据对象(查看 AutoMapper)。您的应用只会知道您的模型对象。

这样做将使您与对象交互的方式保持一致,并且您可以开始向允许更细粒度访问表的权力施加压力,此时您可以调整您的数据访问支持 EF 和删除 SP 的层。此时您可以考虑将您创建的对象迁移到通过 EF 持久化的 POCO 对象。

我们遇到了类似的问题,即“禁止”授予原始数据库访问权限。我们通过使用一种模型克服了这个问题,在该模型中,我们只授予对正在使用的表的访问权限,而不是整个数据库,并确保 DBA EF 使用参数化 SQL,从而消除了 SQL 注入的担忧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多