我的实体数据模型中有一个存储过程,并将其添加到函数imports。
问题是......当且仅当我将返回指定为实体类型时,Visual Studio才会在模型的代码隐藏中生成函数代码。 标量和null返回类型不起作用。当我选择它时,Visual Studio不会生成功能代码。
我缺少什么,或者这是一个错误? 任何解决方法?
<小时/> 使用Visual Studio 2008 v9.0.30729.1 SP(Service Pack 1)
答案 0 :(得分:8)
这不是一个错误,因为缺少一个功能。实体框架现在不支持返回标量值的存储过程。我相信这应该在.NET 4.0中改变。在此期间,您可以使用通过CreateDbCommand提供的商店连接来执行此类存储过程。
答案 1 :(得分:4)
由于现在唯一有效的方法是将返回类型映射到实体,因此一种解决方法是创建与返回数据对应的视图并为视图创建实体。这仅在SP执行SELECT以返回结果集而不是返回值时才有效。我得到了这个使用示例应用程序,如下所示: SP:
ALTER PROCEDURE [dbo].[DoSomething]
@param1 varchar(50),
@param2 varchar(50)
AS
BEGIN
DECLARE @ID INT
SET NOCOUNT ON;
INSERT tmp_header (fname, lname) VALUES (@param1, @param2)
SET @ID = SCOPE_IDENTITY()
SELECT @ID AS 'id'
END
查看:
CREATE VIEW [dbo].[View_1]
AS
SELECT 0 as id
创建函数import,将返回类型设置为View_1并构建模型。
代码:
class Program
{
static void Main(string[] args)
{
using (PS_RADSTESTEntities ctx = new PS_RADSTESTEntities())
{
EntityConnection ec = ctx.Connection as EntityConnection;
ec.Open();
DbTransaction txn = ec.BeginTransaction();
ObjectResult<View_1> result = ctx.DoSomething("Toby", "Kraft");
View_1 row = result.Single();
int id = row.id;
// do some other interesting things ...
ctx.SaveChanges();
txn.Commit();
}
}
}
确保在视图和SP之间设置完全相同的列名。 托比
答案 2 :(得分:3)