我遇到了一个问题,我一直在反复讨论,每次我认为我有一个解决方案时,我似乎都会回到一个没有满足的核心需求(我稍后会详细介绍)。
在一个简单的层次上,我试图做的是从存储过程提供的数据中返回一组对象。对象层次结构如下
Shipment Object-它有一个ShipmentNumber字符串属性和一个List集合
OrderHeader对象-它具有OrderNumber双精度、OrderType字符串、ShipmentNumber字符串属性和List集合
OrderLine对象-它具有OrderNumber双精度、OrderType字符串、OrderLine双精度、ItemNumber字符串属性
装运<->OrderHeader是基于任一对象上的ShipmentNumber的1对多
订单号<->OrderLine是基于任一对象上的OrderNumber和OrderType的1对多
这个对象结构可视化了我需要如何查看特定报告的数据(实际上它比这个复杂得多,但这是我最初尝试使用的一个简单示例),并且与我的数据库表结构没有相似之处。我正试图将存储过程中的数据映射到这个结构中,这样我就得到了一个发货集合,然后在其中有一个订单标题集合,这些标题中有一个行集合,但我似乎无法做到这一点。我似乎无法用LINQ做到这一点,所以我正在研究实体框架。似乎可以将SP设置为返回几个SELECT输出,然后使用ObjectContext.Translate<…>(…)方法将数据映射到对象中,就像这样,然后Translate方法将负责应用关联,但当我尝试此操作时,我会收到一个错误报告,报告实体对象属性没有映射。研究这个映射,似乎又回到了必须引用实际数据库表的对象(这是我经常遇到的问题)。
如果可能的话,我如何使用LINQ、EF或其他方法将这些数据从存储过程加载到对象结构中,而不必将类基于数据库表?这肯定是可能的吗?我可以用一个对象集合来实现这一点,但当这些对象包含其他对象的集合时,问题似乎就来了。
只有几个背景点:-我必须使用存储过程来获取数据-这超出了我的控制范围,不会改变。所涉及的表分布在几个数据库服务器上,其中一些数据库服务器在物理上无法访问,但是它可以访问的数据库服务器具有对所有服务器的跨服务器查询访问权限(因此,使用SP的另一个原因是,AFAIK、LINQ等不能进行跨服务器联接),因此,如果我确实从我的开发环境中提取表定义(显然,我可以访问所有表),那么在生产环境中就无法访问这些表定义。
我可以创建一个所有数据的扁平数据集,然后读取它,手动检测分组更改(发货号、订单号),然后相应地编写代码,但这并没有利用OOP,而且似乎是一个很大的倒退,而且它没有为其他未来的需求提供可重复使用的对象。相反,我可以编写代码来遍历数据集,并手动将数据加载到这些对象中,但我想知道为什么要重新发明轮子——这肯定不是一个不寻常的要求,必须有办法做到这一点?
谢谢-MH
如果可能的话,我可以如何加载该数据来自存储过程,使用LINQ、EF或其他没有必须将我的类建立在数据库上桌子?
我是否正确理解您希望存储过程为您实现结果集,并在对象之间建立连接,而不映射实体数据模型中的对象?在这种情况下,答案是否定的,这是不可能的。
Translate
方法使用映射信息,因此无法将结果集转换为自定义信息。只有当对象由上下文=>跟踪时,相关对象的自动连接才有效,它们必须是映射实体。
EF中的默认存储过程映射只能使用展平层次结构,其中结果集中的列映射到目标对象中的属性。EF本机不支持返回多个结果集的存储过程(Linq-to-sql支持),但您可以使用EFExtensions来获得这种支持(但它更像是使用本机ADO.NET)。