繁体   English   中英

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

[英]Result type for stored procedures that cannot be mapped to Complex type on EF

我有以下问题

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

像这样

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个具有多个联接的表)中返回更多的列。 在我看来,必须手动维护关联的复杂类型就像一场维护噩梦。

我要避免这种情况,并尽快发现可能的错误。

谢谢

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

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

  1. 我创建了一个视图,该视图不返回具有确切结构的行作为存储过程的结果View1
  2. 在存储过程中,我包括“从View1选择联合”
  3. 在EF中,我将View1添加到模型中(从中创建实体)并将该实体映射到存储过程的结果

这是代码:

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中的存储过程返回一个复杂类型,当我从数据库更新模型时,该类型会更新
  • 存储过程和复杂的结果类型不会不同步; 这是因为如果存储过程有任何可能改变,以返回不同的结果集,并且相关视图未进行相应的更新,则在测试存储过程后将立即捕获该错误-由于并集联接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM