背景:我最初在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;
}
我的存储库类中的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
任何所有帮助都将不胜感激。
答案 0 :(得分:0)
它不起作用,因为Add方法不会向数据库保存任何内容,因此它无法返回在数据库中创建的Id。一旦您在上下文中致电ReplacementReason
,我们就会直接在您的SaveChanges
中填充ID。
因此,如果您想要将记录保存到数据库并返回Id的方法,它必须如下所示:
public int CreateReplacementReason (ReplacementReason replacementReason)
{
_db.ReplacementReasons.Add(replacementReason);
_db.SaveChanges();
return replacementReason.Id;
}
但在大多数情况下,这不是您想要的,因为您希望将所有更改保存在一起,而不是在每次修改数据后执行SaveChanges
。