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

Posted

技术标签:

【中文标题】如何在 Entity Framework 4.1 中使用更新 SPROC【英文标题】:How to use an Update SPROC in Entity Framework 4.1 【发布时间】:2011-10-04 23:23:56 【问题描述】:

背景:我最初在 MVC3 和 Entity Framework 4.1(Database First & Generated DBContext)上创建了一个应用程序。我遵循存储库模式。为了满足 Corp. 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()

我的存储库类中调用具有返回值 (Scope_Identity) 的 SPROC 的创建方法应该如何?我想我可以在我当前的方法中添加一个 return 语句并更改返回类型。当然,这没有用。

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

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

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

SELECT  SCOPE_IDENTITY() AS Id

我们将不胜感激。

【问题讨论】:

【参考方案1】:

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

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

public int CreateReplacementReason (ReplacementReason replacementReason)

    _db.ReplacementReasons.Add(replacementReason);
    _db.SaveChanges();
    return replacementReason.Id;

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

【讨论】:

以上是关于如何在 Entity Framework 4.1 中使用更新 SPROC的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Entity Framework 4.1 与 MVC 3 登录一起使用

MVC3 Entity Framework 4.1RC @Html.DropDownListFor 如何实际工作?

在 Entity Framework 4.1 中,如何使用 SqlQuery 创建在编译时不知道查询详细信息的匿名对象

Entity Framework 4.1 中的性能监控选项

卸载 Entity Framework 4.1 六月 CTP

忽略 Entity Framework 4.1 Code First 中的类属性