【发布时间】:2015-05-12 07:27:59
【问题描述】:
我是使用存储过程和实体框架进行编程的新手。我创建了一个 SQL Server 数据库,其中包含一个名为 dbo.Book 的表,该表将包含书名和一个自动增量 ID 列。
我创建了一个存储过程来向dbo.Book 插入一条记录,并返回新输入记录的ID 列值:
USE [Testing1DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE dbo.uspAddBook
@title NVARCHAR(50),
@bookId INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.Book (TItle)
VALUES (@title)
SELECT @bookID = @@IDENTITY
END
当我进入 Visual Studio 并使用我现有的数据库将实体框架数据模型添加到我的 C# Windows 窗体项目时,它会生成一个与我的存储过程相关的 ...Context.cs 代码,如下所示:
public virtual int uspAddBook(string title, ObjectParameter bookId)
{
var titleParameter = title != null ?
new ObjectParameter("title", title) :
new ObjectParameter("title", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("uspAddBook", titleParameter, bookId);
}
我的问题是,这个方法需要 2 个参数。 1 是我可以从我的代码中传递的标题,另一个参数由“bookId”表示,我不知道是什么,因为我想要只传递书名并获得book_ID 作为回报.所以,我不能调用方法“uspAddBook”,因为我不知道要发送什么作为第二个参数。请帮我。
【问题讨论】:
-
在
uspAddBook方法中尝试return Convert.ToInt32(bookId.Value);。 -
我建议使用
SCOPE_IDENTITY()而不是@@IDENTITY来获取新插入的标识值。 See this blog post for an explanation as to WHY -
@Jenish,我需要将您建议的代码放在哪里?
-
@marc_s ,我首先尝试使用 'SCOPE_IDENTITY()'。但没有运气。 :(
-
请注意,设置各种存储过程以便您可以对数据库进行过程访问,这有点违背使用对象-关系-映射范式的目的,除非您只想真正使用的高级查询功能。
标签: c# sql-server entity-framework visual-studio stored-procedures