我一直试图理解为什么在尝试使用stroed过程来插入记录时会出现异常。我在数据库中有一个公司表,其中包含Id(Guid),Name(nvarchar)和timestamp(datetime)列.Id列是一个RowGuid。我也使用SQL Server 2005和EF4
存储过程是
ALTER PROCEDURE [dbo].[InsertCompanySP]
@companyName NVarChar(50),
@timeStamp datetime
AS
BEGIN
SET NOCOUNT ON;
Insert into dbo.Company(Name,TimeStamp) values (@companyName, @timeStamp)
select SCOPE_IDENTITY() as Id
END
我用来调用此存储过程的代码是
using (var context = new testEntities())
{
try
{
Company c = new Company();
c.Name = "abcd";
c.TimeStamp = DateTime.Now;
context.Companies.AddObject(c);
context.SaveChanges();
Console.WriteLine(c.Id);
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred");
}
}
您可以猜到,在Entity Framework模型的插入存储过程映射中,companyName和timeStamp绑定到我公司实体的Name和TimeStamp属性,并且Id绑定到公司实体的Id属性。如果我继续并删除结果列绑定,一切正常(调用存储过程并且不抛出任何异常)。当我有结果绑定到位以返回添加的公司的ID时,我仍然可以看到被调用的完全相同的存储过程,但它会引发异常说
"为不可为空的成员返回了一个空存储生成的值' Id'类型' testModel.Company'。"
我假设我的存储过程中可能有一些错误,返回插入行的Id,但我无法弄明白。我还尝试在存储过程中使用以下内容来返回插入的公司ID的值,但我仍然得到相同的异常
select Id = @@IDENTITY
更新:我忘了提到ID在EF中也标有StoreGeneratedPattern = Identity
更新:我解决了这个问题,感谢@olivehour ..将我的存储过程修改为
ALTER PROCEDURE [dbo].[InsertCompanySP]
@companyName NVarChar(50),
@timeStamp datetime
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TmpTable TABLE (Id uniqueidentifier);
Insert into dbo.Company(Name,TimeStamp)
OUTPUT INSERTED.Id INTO @TmpTable
values (@companyName, @timeStamp)
select Id from @TmpTable
END