2011-06-02 33 views
0

我遇到了一个问题,我一直在围绕着,每当我想我有一个解决方案时,我似乎都会回到未实现的核心要求(我将在后面详细介绍)。将数据映射到.NET中的非表格内容

我试图做的,在一个简单的水平,是从存储过程提供的数据返回对象的集合。对象分层是如下

出货对象 - 这有一个ShipmentNumber字符串属性和List集合

OrderHeader对象 - 这有ORDERNUMBER双,订单类型的字符串,ShipmentNumber字符串属性和List集合

订单行对象 - 这有双重ORDERNUMBER,订单类型串,OrderLine的双,ItemNumber字符串属性

运费< - > OrderHeader是1至基于ShipmentNumber在任许多对象

ORDERNUMBER < - >订单行是1对多根据订单号码和订单类型上的任一对象

这个对象结构形象化我需要如何查看我的数据特定报告(它实际上有很多比这更复杂,但这是一个简单的例子,我最初试图去工作),并没有像我的数据库表结构。我试图将数据从一个存储过程映射到这个结构中,这样我最终得到了一批货物,然后在这些货物中有一个订单标题集合,并且这些集合中包含行集合,但我似乎没有能够做到这一点。我似乎无法用LINQ来做,所以我正在查看实体框架。看起来你可以设置一个SP来返回多个SELECT输出,然后使用ObjectContext.Translate < ...>(...)方法将数据映射到对象中,像这样,然后Translate方法将负责应用关联,但是当我尝试这个时,我收到一个错误,报告实体对象属性没有被映射。看看这个映射,它似乎回到了必须引用实际数据库表的对象(这是我反复出现的问题)。

如何,如果可能的话,我可以使用LINQ,EF或其他东西将这些数据从存储过程加载到这个对象结构中,而无需将我的类放在数据库表上?这当然有可能吗?我可以用一个单一的对象集合来做到这一点,但是当这些对象包含其他对象的集合时,问题似乎就出现了。

只有几个背景点: - 我必须使用存储过程来获取数据 - 这是超出我的控制,不会改变。有关表分布在多个数据库服务器上,其中一些数据库服务器在物理上无法访问,但它有权访问的数据库服务器却跨服务器查询对所有服务器的访问(因此使用SP的另一个原因是因为,AFAIK,LINQ等不能进行跨服务器连接),所以如果我从我的开发环境(显然,我确实可以访问所有表)获取表定义,这些将无法在生产环境中访问环境。

我可以创建一个所有数据的扁平数据集,然后通过它读取,手动检测分组更改(Shipment Number,OrderNumber),然后相应地编写我的代码,但这不会使用OOP,并且看起来好像向后退一大步,再加上它不会为其他未来的需求提供可重用对象。相反,我可以编写代码来查看数据集并手动将数据加载到这些对象中,但我想知道为什么要重新发明轮子 - 当然,这不是一个不寻常的要求,并且必须有一种方法可以做到这一点?

谢谢 - MH

回答

0

如何,如果可能的话,我可以加载 这个数据,从存储过程(S), 到使用 LINQ,EF,或别的物体的这种结构没有 必须将我的类基于数据库 表?

难道我理解正确的话,你想存储过程来兑现的结果集为你做出不映射对象的实体数据模型对象之间的连接?在这种情况下,答案是否定的,这是不可能的。

Translate方法使用映射信息,因此它不能将结果集翻译成自定义信息。相关对象的自动连线仅在上下文跟踪对象时才起作用=>它们必须是映射实体。

EF中的默认存储过程映射只能使用扁平层次结构,其中结果集中的列映射到目标对象中的属性。 EF本身不支持存储过程返回多个结果集(Linq-to-sql),但you can use EFExtensions to have this support(但更像是使用本机ADO.NET)。

+0

不,我非常愿意创建映射对象来将返回的列名映射到对象属性,但实体对象(除非我错过了某些东西)似乎只能映射到表列并且没有对应我可以映射到的表格。与EFExtensions的链接类似于我正在使用的示例,但问题在于,由于某些不明确的原因,实体创建了_have_以映射到数据库表 - 我找不到在实体上手动创建映射链接的方式所以我可以指定列名的属性映射到 – 2011-06-02 13:04:09

+0

我已经在EF类中创建了所有三个对象作为实体,但是当我尝试指定映射时,我只能得到一个表选择或映射到update/insert/delete存储过程 - 似乎没有办法说“它没有映射到表,但是这里是属性 - >列绑定,就好像它已经这样做了”,以便这些可以映射到存储过程的输出 – 2011-06-02 13:08:23

+0

另外,正如我所提到的,这不会在EF中完成 - 我很乐意使用任何免费的数据映射工具来执行此操作。 – 2011-06-02 13:13:58