在Entity Framework中,我们通常会用Function Import来将存储过程映射到程序段,从而可以用ObjectContext或DbContext的实例像调用方法一样来调用存储过程。在包含有output参数的存储过程中,我们用一个简单的例子来说明应该如何处理。
数据库表:
CREATE TABLE Test
(
Id int primary key identity,
Name nvarchar(50) not null,
Description nvarchar(max)
)
存储过程:
CREATE PROCEDURE dbo.TestInsert
@Name varchar(50),
@Description varchar(max),
@TestID int OUT
AS
INSERT INTO Test(Name,Description) VALUES(@Name,@Description)
SET @TestID = SCOPE_IDENTITY()
第一步:
在Funtion Import的wizard中将Return Type设置为"None"
此时可以从Context类中发现此存储过程映射的方法
#region Function Imports
/// <summary>
/// No Metadata Documentation available.
/// </summary>
/// <param name="name">No Metadata Documentation available.</param>
/// <param name="description">No Metadata Documentation available.</param>
/// <param name="testID">No Metadata Documentation available.</param>
public int TestInsert(global::System.String name, global::System.String description, ObjectParameter testID)
{
ObjectParameter nameParameter;
if (name != null)
{
nameParameter = new ObjectParameter("Name", name);
}
else
{
nameParameter = new ObjectParameter("Name", typeof(global::System.String));
}
ObjectParameter descriptionParameter;
if (description != null)
{
descriptionParameter = new ObjectParameter("Description", description);
}
else
{
descriptionParameter = new ObjectParameter("Description", typeof(global::System.String));
}
return base.ExecuteFunction("TestInsert", nameParameter, descriptionParameter, testID);
}
#endregion
第二步:
从上面代码看到该方法需要三个参数,而第三个是一个ObjectParameter类型的参数,该类型有一个Value属性,之后我们就会通过该属性来获取output参数的值。
static void Main()
{
using (TestEntities context = new TestEntities())
{
ObjectParameter output = new ObjectParameter("TestID", typeof(Int32));
context.TestInsert("Allen", "Entity Framework", output);
Console.WriteLine(output.Value);
}
}
在VS2012中,甚至可以省去Function Import的过程,在将存储过程添加至Entity Model Designer的时候,VS2012附带了将导入的存储过程转换为方法的选项。