如何在Entity Framework 4.1中使用更新SPROC

时间:2011-10-04 23:23:57

标签: c# asp.net-mvc entity-framework stored-procedures entity-framework-4.1

背景:我最初在MVC3和Entity Framework 4.1(Database First& Generated DBContext)上创建了一个应用程序。我遵循存储库模式。为了满足公司DBA要求,我需要将所有数据访问转换为仅使用SPROCS来推广数据库。我正陷入一些我希望得到答案的事情......

  • 插入/删除/更新功能

我已经创建了插入,删除和更新功能。我已将它们添加到我的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()

我的存储库类中的create方法应该如何调用具有返回值(Scope_Identity)的SPROC?我以为我可以在当前方法中放置一个return语句并更改返回类型。当然,这不起作用。

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

这是在更新后返回Scope_Identity()后调用的SPROC

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

SELECT  SCOPE_IDENTITY() AS Id

任何所有帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

它不起作用,因为Add方法不会向数据库保存任何内容,因此它无法返回在数据库中创建的Id。一旦您在上下文中致电ReplacementReason,我们就会直接在您的SaveChanges中填充ID。

因此,如果您想要将记录保存到数据库并返回Id的方法,它必须如下所示:

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

但在大多数情况下,这不是您想要的,因为您希望将所有更改保存在一起,而不是在每次修改数据后执行SaveChanges