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