EntityFramework 5.0和TVP不能一起工作

时间:2014-05-01 16:32:01

标签: c# .net sql-server entity-framework

我有一个接受tvp作为参数的sproc。我测试了它,它在db端工作正常。现在在我的c#项目中,我尝试在edmx中添加该sproc并获得跟随错误。

  

消息8函数'usp_MysprocName'在参数索引0处具有参数'ParameterNameTVP',其具有数据类型'表类型',目前.NET Framework版本当前不支持该类型。该职能被排除在外。

我将.net框架从4.0升级到4.5并通过nuget重新安装(因此它适用于新的.net 4.5)实体框架lib并且仍然显示同样的错误。 我发现here entityframework 5.0支持表值函数(我必须使用5.0版本而不是最新版本6)。至于.net框架我使用的是最新版本。我不确定为什么VS不让我导入或添加新的sproc。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

实体框架不支持TVP的存储过程。但是,支持表值函数,但它不是一回事。为了获得类似的结果,我必须做的是更改参数的数据类型并使用xml。然后我写了一个TVF来读取xml并返回一个表来加入。

假设您传递了一个xml,如:     <列表>         <编号→1< / ID>     < /列表>     

create function [dbo].[XMLToTable] (@xml xml)
returns table
as
return (
--get the ids from the xml
select Item.value('.', 'int') as id from @xml.nodes('//id') as T(Item)
)

,您的选择将类似于

select t.* from MyTable t
inner join dbo.XMLToTable(@myXmlParam) x on x.id = t.id

EF会将此视为字符串参数,您只需将其传递即可。这相对较快,因为它使用内联表值函数。不幸的是,在EF决定支持TVP之前,它是一种解决方法。

请在此处上传功能请求: http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/status/317789

编辑: 这是一个稍微复杂的例子,说明如何处理多个值:

declare @xml xml = 
'
<complex>
    <companies>
        <id>123456</id>
        <name>My Company</name>
    </companies>
    <companies>
        <id>147889</id>
        <name>Some Co</name>
    </companies>
</complex>
'

declare @tbl table (id int, name varchar(50))

insert into @tbl values (123456, 'My Company'),
            (147889, 'Some Co'),
            (788545, 'Great Corp')


select * from @tbl co
left join dbo.XMLCompanies(@xml) x on x.id = co.id

create function [dbo].[XMLCompanies] (@xml xml)
returns table
as
return (
--get the ids from the xml
select 
     id=Item.value('./id[1]', 'int')
    ,name=Item.value('./name[1]', 'varchar(50)')
from @xml.nodes('//companies') as T(Item)
)