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