如何使用 Entity Framework 使用 SQL 服务器存储过程

How to work with SQL Server stored procedures using Entity Framework

我不熟悉使用存储过程和 Entity Framework 进行编程。我已经创建了一个 SQL 服务器数据库,其中包含一个名为 dbo.Book 的 table,它将保存书名和一个自动增量 ID 列。

我创建了一个存储过程来向 dbo.Book 和 return 新输入记录的 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 并使用现有数据库将 Entity Framework 数据模型添加到我的 C# Windows Forms 项目时,它会生成与我的相关的 ...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 在 return 中。所以,我无法调用 'uspAddBook' 方法,因为我不知道要将什么作为第二个参数发送。请帮我。

您可以设置一个 ObjectParameter...

ObjectParameter bookId = new ObjectParameter("bookID", typeof(Int32));//check type
context.uspAddBook("Title", bookId);
Int newBookId = bookId.Value;

或者,您可以像这样使用 EF....

  context.Book.AddObject(title);
  context.SaveChanges();
  Int bookId = title.bookId; 

我还没有测试过这些,但它是正确的...