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