0

背景:我最初在MVC3和Entity Framework 4.1(Database First &生成的DBContext)上創建了一個應用程序。我遵循一個存儲庫模式。爲了滿足公司DBA的要求,我需要將所有數據訪問轉換爲僅使用SPROCS來推廣數據庫。我陷入對,我希望得到答案的幾件事情...如何在實體框架中使用更新SPROC 4.1

  • 插入/刪除/更新功能

我創建我的插入,刪除,更新和功能。我已將它們添加到我的EDM模型中,並將它們填充到相應實體的映射詳細信息中的「映射實體到函數」選項卡上。從我讀過的內容中,我不應該更改我的存儲庫類中的代碼。它是否正確? (下面的代碼)

public void CreateReplacementReason (ReplacementReason replacementreason) 
    { 
     _db.ReplacementReasons.Add(replacementreason); 
    } 

    public void UpdateReplacementReason(ReplacementReason replacementreason) 
    { 
     var rr = FetchReplacementReason(replacementreason.PK_ReplacementReasonId); 
     rr.DF_IsActive = replacementreason.DF_IsActive; 
     rr.ReplacementReasonDesc = replacementreason.ReplacementReasonDesc; 
    } 
  • 返回SCOPE_IDENTITY()

一個應該如何在我的倉庫類的外觀,要求其有返回值(SCOPE_IDENTITY)一個存儲過程創建方法?我想我可以在我的當前方法中放入一個return語句並更改返回類型。這當然不起作用。

public int CreateReplacementReason (ReplacementReason replacementreason) 
    { 
     return _db.ReplacementReasons.Add(replacementreason); 
    } 

這是)任何任何幫助都將認識到,正在被更新後調用返回SCOPE_IDENTITY的存儲過程(

INSERT INTO [dbo].[ReplacementReason] ([ReplacementReasonDesc], [DF_IsActive], [CreatedDateTime]) 
SELECT @ReplacementReasonDesc, @DF_IsActive, @CreatedDateTime 

SELECT SCOPE_IDENTITY() AS Id 

回答

0

它不起作用,因爲Add方法不會將任何內容保存到數據庫,因此它不能返回在數據庫中創建的Id。一旦您在您的上下文中調用SaveChanges,該ID將直接填充到您的ReplacementReason中。

所以,如果你想方法,這將節省記錄到數據庫,並返回標識必須是這樣的:因爲你想要的所有的更改保存在一起,而不是

public int CreateReplacementReason (ReplacementReason replacementReason) 
{ 
    _db.ReplacementReasons.Add(replacementReason); 
    _db.SaveChanges(); 
    return replacementReason.Id; 
} 

但是在大多數情況下,這是不是你想要的每次數據修改後執行SaveChanges