【问题标题】:ADO.NET Ef4- How can i map a entity to stored procedure without mapping to tableADO.NET Ef4-如何将实体映射到存储过程而不映射到表
【发布时间】:2012-02-18 02:04:42
【问题描述】:

我们在数据库层使用 ado.net 实体框架 4.0,我是 ado.net 实体框架的新手。我通过在实体框架中添加实体来创建实体。我想将该实体映射到存储过程而不是数据库表。存储过程将返回与实体相同的列。如果不映射到表格,这怎么可能以及我如何做到这一点?

【问题讨论】:

    标签: entity-framework entity-framework-4


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    这是不可能的,因为 ObjectSet 是 IQueryable 并且将 ObjectSet 映射到存储过程不会给你一个 IQueryable,因为存储过程本质上是无法组合的。您可以做的最好的事情是将存储过程中的内容放入一个视图中,然后将视图映射到一个可能的 ObjectSet。

    【讨论】:

    • linq-to-sql 是可能的,那么为什么实体框架不可能呢?我已经用 Linq 做过很多次了。
    • 我的意思是我不希望实体与表绑定。我想使用这个实体作为我的存储过程选择语句的结果,比如 select productid,productname from product 并且会有一个具有这些属性的产品类。但我不想将产品绑定到产品表,我只想将其与存储过程绑定。
    • 好的放心,不支持。内部对此问题进行了辩论,但我不确定这是否会在不久的将来得到支持。
    【解决方案3】:

    您需要创建一个复杂类型,而不是实体。打开模型浏览器并将您的存储过程作为“函数导入”导入(您的 SP 不得使用#tempTables,但您可以改用@tableVariables);在函数导入向导中,您会看到一个“创建复杂类型”按钮。

    SP 成为模型上下文中的方法,您可以使用它来获取 IEnumerable[TheComplexType]。

    在 EF4.1 代码优先中,它更简单,您将 [ComplexType] 属性放在任何类的顶部,您可以将该类型用作 context.ExecuteStoreQuery[T] 的返回类型。如果您的属性的名称与返回的列完全一致(并且类型对齐),则映射是“神奇的” - 它可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多