无法映射到EF上的复杂类型的存储过程的结果类型

时间:2014-04-26 11:41:50

标签: sql-server entity-framework stored-procedures complextype

我有以下问题

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

像这样的东西

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个具有多个连接的表)返回更多列。并且必须手动维护相关的复杂类型对我来说就像维护噩梦一样。

这是我想要避免的,并且尽快发现可能的错误。

谢谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

目前,我正在使用以下方法:

  1. 我创建的视图不返回具有与存储过程结果完全相同的行 - View1
  2. 在存储过程中,我包括来自View1
  3. 的Union Select
  4. 在EF中,我将View1添加到模型(从中创建实体)并将该实体映射到存储过程的结果
  5. 以下是代码:

    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
    • 更新模型时,它会更新
    • 存储过程和复杂结果类型不会脱离同步;这是因为如果存储过程发生任何变化,返回不同的结果集,并且相关视图没有相应更新,一旦测试存储过程,就会被捕获 - 因为联合连接。