我的公司使用存储过程进行所有SELECT操作,因此我很难创建合理的导航属性。我不太关心他们是否懒得加载。
例如,我为Customer创建了一个实体,然后创建了一个FunctionImport来映射GetAllCustomersSP以返回Customer实体的集合。但我想在每个Customer实体上使用导航属性“Orders”。
但是,如果我使用Customer实体分部类来添加此属性,则问题是我无法访问原始Context,因此我无法显式或延迟调用GetCustomerOrdersSP。
我能看到的唯一选择是修改我的存储库以显式添加这些属性,这似乎很蹩脚,因为它将实体逻辑放入存储库。
这里有什么我想念的吗?我可以在实体模型设计器中看到我可以指定自定义插入,更新,删除SP,但我没有看到任何方法使用选择SP来实际检索数据。
答案 0 :(得分:1)
我同意Tim的观点......你提出的任何解决方案都不会充分利用ORM,并且将成为潜在的噩梦。我建议在代码中创建一个以你想要开发的方式构建的模型。
在应用程序的数据访问层中,您可以映射使用SP的数据对象来水化模型对象(查看AutoMapper)。您的应用只会知道您的模型对象。
这样做可以让您在如何与对象进行交互时保持一致,并且您可以开始对权限施加压力,以允许对表格进行更精细的访问,此时,您可以调整数据访问权限层支持EF并删除SP。此时,您可以考虑将创建的对象迁移到通过EF保留的POCO对象。
我们遇到了一个类似的问题,即授予原始数据库访问权限是“禁止的”。我们通过使用一个模型克服了这个问题,在该模型中我们只授予对使用它们的表的访问权限,而不是整个数据库,并确保EF使用参数化SQL的DBA,从而消除了SQL注入的问题。