簡體   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