实体框架和存储过程返回临时表问题



(免责声明-我不是数据库设计师。我只是一个可怜的开发人员,必须让它发挥作用。)

目前共有17张结构相同的表格——姓名、地址、电话号码。

给定一个电话号码,我必须检查其中任何一个表中是否有匹配的条目,然后返回该地址。

因此,我创建了一个视图来获取表的列表(有一个ref表保存了这些信息),然后我创建了的存储过程

  1. 创建临时表
  2. 使用游标,使用sql串联检查视图中的每个表中的电话号码。如果找到一条记录,请将其插入临时表中
  3. 返回临时表中的行

这一切都适用于直接T-SQL。

现在,我尝试使用EntityFramework4+来调用存储过程。但是函数导入接口不会生成列。它说返回类型=none,LINQ代码需要一个int,不会编译。

有什么想法可以让它发挥作用吗?

我知道,如果绝对必要的话,我可以将检查表部分移到代码中,但我宁愿让上面的方法发挥作用。

EF获取存储过程信息的默认方法只要求"元数据"-它不执行查询或数据修改命令。因此,EF无法使用临时表、动态SQL等接收有关存储过程的信息,因为在真正执行命令之前,这些信息是未知的。

作为一种变通方法,你可以修改你的程序,并在开始时放入

SET FMTONLY OFF

只有在尝试将存储过程导入数据库并确保存储过程不会在数据库中进行任何修改时才使用此选项,因为每次尝试导入或更新实体模型中的存储过程时都会执行这些修改。

这是一个彻底的破解,但我过去曾使用过它来使用具有复杂存储过程的实体框架。它利用了实体框架在创建类型以镜像返回的数据集时使用NULL参数值的事实。做一个简单的IF(参数为NULL)和一个与您将返回的内容匹配的伪返回数据集。

ALTER proc [dbo].[cust_auto_doc_list_invoice]
@interval_ref integer
AS
SET NOCOUNT ON;
IF @interval_ref IS NULL
BEGIN
-- This is to fool the edmx generator.
    SELECT CONVERT(integer,0) as group_ref,
        CONVERT(varchar(50),'') as group_name,
        CONVERT(integer,0) as wloc_ref,
        CONVERT(decimal(18,0),0) as invoice_ref,
        CONVERT(decimal(10,0),0) as cust_ref,
        CONVERT(varchar(50),'') as cust_name,
        CONVERT(decimal(10,0),0) as csnee_ref,
        CONVERT(varchar(50),'') as csnee_name
END
ELSE
BEGIN
  -- Do real work here
END

-tom

添加这个非逻辑代码块解决了问题。即使它永远不会击中

IF 1=0 BEGIN
    SET FMTONLY OFF
END

为什么我的类型化数据集不喜欢临时表?

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataset/thread/fe76d511-64a8-436d-9c16-6d09ecf436ea/

我不知道EF部分的解决方案,但在数据库中我只创建以下视图:

select * from Table1
union all select * from Table2
union all select * from Table3
union all select * from Table4
...

然后,您可以使用EF以任意方式查询视图。不需要光标之类的。

最新更新