异常使用存储过程使用Entity Framework插入记录时

时间:2011-12-09 17:52:23

标签: entity-framework stored-procedures entity-framework-4

我一直试图理解为什么在尝试使用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

1 个答案:

答案 0 :(得分:1)

看看this。您不能将SCOPE_IDENTITY用于Guids。如果您的主键是GUID上的群集,则为could also be bad