[英]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.