使用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条件通过,则上面的代码有效,只有当我没有填充值时才会抛出错误
答案 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.