【发布时间】:2012-02-18 02:04:42
【问题描述】:
我们在数据库层使用 ado.net 实体框架 4.0,我是 ado.net 实体框架的新手。我通过在实体框架中添加实体来创建实体。我想将该实体映射到存储过程而不是数据库表。存储过程将返回与实体相同的列。如果不映射到表格,这怎么可能以及我如何做到这一点?
【问题讨论】:
标签: entity-framework entity-framework-4
我们在数据库层使用 ado.net 实体框架 4.0,我是 ado.net 实体框架的新手。我通过在实体框架中添加实体来创建实体。我想将该实体映射到存储过程而不是数据库表。存储过程将返回与实体相同的列。如果不映射到表格,这怎么可能以及我如何做到这一点?
【问题讨论】:
标签: entity-framework entity-framework-4
【讨论】:
这是不可能的,因为 ObjectSet 是 IQueryable 并且将 ObjectSet 映射到存储过程不会给你一个 IQueryable,因为存储过程本质上是无法组合的。您可以做的最好的事情是将存储过程中的内容放入一个视图中,然后将视图映射到一个可能的 ObjectSet。
【讨论】:
您需要创建一个复杂类型,而不是实体。打开模型浏览器并将您的存储过程作为“函数导入”导入(您的 SP 不得使用#tempTables,但您可以改用@tableVariables);在函数导入向导中,您会看到一个“创建复杂类型”按钮。
SP 成为模型上下文中的方法,您可以使用它来获取 IEnumerable[TheComplexType]。
在 EF4.1 代码优先中,它更简单,您将 [ComplexType] 属性放在任何类的顶部,您可以将该类型用作 context.ExecuteStoreQuery[T] 的返回类型。如果您的属性的名称与返回的列完全一致(并且类型对齐),则映射是“神奇的” - 它可以正常工作。
【讨论】: