首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在EF上映射到复杂类型的存储过程的结果类型

不能在EF上映射到复杂类型的存储过程的结果类型
EN

Stack Overflow用户
提问于 2014-04-26 11:41:49
回答 2查看 511关注 0票数 0

我有以下问题

我有一个存储过程,它执行一些复杂的处理,最终需要选择不同的行。

就像这样

代码语言:javascript
复制
Create Procedure MyProc
    @par1 as nvarchar(50)
As
    select fld1, fld2 into #tmpTable from Table1
    union
    select fld1, fld2 from Table2
    union
    select fld1, fld2 from Table3

    -- select result
    select distinct fld1, fld2 from #tmpTable

我需要从EF调用这个存储过程。我将它添加到ED模型中,但EF没有生成任何结果复杂类型。

我不想在模型中手动创建复杂类型,因为实际的存储过程是复杂的,如果随着时间的推移,存储过程可能会改变(通过添加/更改结果列),我还必须手动编辑复杂类型(这是我想避免的)。

上面所示的示例非常简单,实际存储过程从一个非常复杂的查询中返回更多列(大约有6-10个具有多个联接的表)。在我看来,必须手动维护关联的复杂类型就像维护噩梦一样。

这就是我想要避免的,并使可能的错误尽快被捕获。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-03 20:07:08

目前,我使用的方法如下:

  1. 我创建了一个视图,它不返回与存储过程结果完全相同的结构的行- View1
  2. 在存储过程中,我包括了Union Select View1
  3. 在EF中,我将View1添加到模型中(从它创建实体),并将该实体映射到存储过程的结果。

以下是代码:

代码语言:javascript
复制
Create View View1 as 
    select cast('' as nvarchar(20)) as fld1,  cast(0 as int) as fld2 

Create Procedure MyProc
    @par1 as nvarchar(50)
As
    select fld1, fld2 into #tmpTable from Table1
    union
    select fld1, fld2 from Table2
    union
    select fld1, fld2 from Table3
    union
    select fld1, fld2 from View1

    -- select result
    select distinct fld1, fld2 from #tmpTable

通过这种方法,我完成了我所需要的:

  • EF中的存储过程返回一个复杂类型,当我从DB更新模型时会更新该类型。
  • 存储过程和复杂结果类型不会脱离同步;这是因为如果存储过程被更改,返回一个不同的结果集,相关的视图没有相应更新,这将在存储过程测试后立即被捕获--因为联合连接。
票数 0
EN

Stack Overflow用户

发布于 2014-04-26 12:24:22

创建一个单独的程序,读取存储过程,然后从它读取值,然后生成您考虑手动编写的源代码。生成代码后,程序应该重新构建项目/解决方案,因此,您只需运行这个新程序来重新生成代码,并在更改存储过程的源代码时生成项目/解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23310351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档