【问题标题】:How to work with SQL Server stored procedures using Entity Framework如何使用实体框架处理 SQL Server 存储过程
【发布时间】: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


【解决方案1】:

你可以设置一个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; 

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

【讨论】:

  • 我已经尝试了第一个建议。但它强调了'typeof(Integer)'中的'Integer'关键字。而且我还需要一个整数返回值。那么如何将 'var' 类型转换为 'int' 类型呢?
  • 我已经更新了,typeof 现在是int,我添加了一个评论让你检查类型。 var 关键字是隐式,所以你不需要转换任何东西。
  • 它无法识别Int,所以我使用了Int32,它成功了。谢谢@christiandev
  • 好的,我无法验证 - 但我已经更新了答案以反映 - 很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多