处理EntityFramework存储过程映射的返回值

时间:2014-01-29 15:32:55

标签: c# entity-framework

使用Entity Framework存储过程映射我将记录插入表中。在插入之前,我将根据我将插入记录并返回id进行一些验证。

当验证失败时,我将返回0,因为EF会抛出以下错误:

  

已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态   内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。

存储过程代码:

alter PROCEDURE [dbo].[testpro]
   @field1 VARCHAR(20),
   @field2  varchar(20)
AS
   DECLARE @field3 INT;
   DECLARE @id INT=0; 

   BEGIN TRANSACTION
   SAVE TRANSACTION STARTWORK

      SELECT @field3 = ID 
      FROM anothertable 
      WHERE field = @field1 

      IF @field3 <>0 
      BEGIN
         --INSERT(@field,@field2,@field3)
         SET @ID = SCOPE_IDENTITY()
      END

      COMMIT TRANSACTION       

      SELECT @ID AS ID
  GO

实体框架代码:

records.ForEach((record) =>
            {
                    repository.Add(record);
            });

repository.UnitOfWork.Save();

我知道错误的原因,但是如何处理这个问题?

我正在使用 EF 5

注意:如果IF条件通过,则上面的代码有效,只有当我没有填充值时才会抛出错误

2 个答案:

答案 0 :(得分:0)

当上下文的主键与数据库不匹配时,通常会发生这种情况。您可以更新模型,然后重试。

答案 1 :(得分:0)

您必须将存储过程返回的ID映射到Entity Framework中实体的ID。您可以通过在存储过程映射窗口中添加结果列绑定来完成此操作。

否则,ObjectContext不知道对象的ID已更改,并将其保持为0.当EF然后尝试插入第二条记录时,它会成功,但它会发现自己有两条记录相同的主键(0)。

这就是The changes to the database were committed successfully, but an error occurred while updating the object context.

的原因