繁体   English   中英

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

[英]Handling return values on EntityFramework stored procedure mapping

使用实体框架存储过程映射,我正在将记录插入表中。 在插入之前,我将基于此进行一些验证,然后插入记录并返回ID。

验证失败时,由于EF引发以下错误,我将返回0:

已成功提交对数据库的更改,但是在更新对象上下文时发生错误。 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条件通过的情况下有效,仅当未填充值时才会引发错误

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

您必须将存储过程返回的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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM