如何在 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 创建在编译时不知道查询详细信息的匿名对象