我有一个sproc接受tvp作为参数。我对它进行了测试,它在db端运行得很好。现在,在我的c#项目中,我尝试在edmx中添加sproc并获得以下错误。
消息8函数'usp_MysprocName‘在参数索引0处有一个参数'ParameterNameTVP’,该参数索引具有数据类型“表类型”,目前目标.NET框架版本不支持该类型。这一职能被排除在外。
我将我的.net框架从4.0升级到4.5,并重新安装(因此它可以通过nuget使用新的.net 4.5)实体框架库,但仍然显示了相同的错误。我发现这里实体框架5.0是支持表值函数的(我必须使用5.0版本,而不是最新的6)。就.net框架而言,我使用的是最新版本。我不知道为什么VS不允许我导入或添加新的sproc。有什么想法吗?
发布于 2014-05-16 14:12:38
实体框架不支持TVP的存储过程,但是支持表值函数,但它不是一回事。为了获得类似的结果,我必须更改参数的数据类型并使用xml。然后,我编写了一个TVF来读取xml并返回一个要加入的表。
假设您传递一个xml,如下所示:
<list> <id>1</id> </list> 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.idEF将把它作为一个字符串参数来处理,您只需传递它。这相对较快,因为它使用内联表值函数。不幸的是,这是一个解决办法,直到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)
)https://stackoverflow.com/questions/23412040
复制相似问题