无法使用存储过程从SQL Server检索数据

时间:2019-12-03 10:28:03

标签: c# entity-framework

我创建了一个存储过程,该过程连接了2个表,并且只需要两个表中的几个字段。

ALTER PROC GetViewers 
@postId int
AS
BEGIN
    SELECT e.Email, e.ImagePath, CONCAT(e.FirstName, ' ', e.MiddleName, ' ', e.SurName) AS 'FullName'
    FROM Posts as p
    JOIN Employees as e
    ON p.AuthorId = e.EmployeeId
    WHERE p.Id = @postId
END

我正在使用一个注入的实体框架核心,以便更新,创建以及使用这种语法所需的所有内容。

用于员工表

var results = _context.Empkoyees.toListAsync();

var posts = _context.Posts.ToListAsync();

,此结果和帖子为我提供了员工和帖子的所有属性。但是,如果我使用使用此

的存储过程
var postId = new SqlParameter("@postId", id);
var x = _context.Posts.FromSql("GetViewers @postId", postId).ToList();

我收到一个错误,提示我某些必填字段不存在。我不想使用linq。请只是存储过程。

2 个答案:

答案 0 :(得分:0)

您错过了一个参数:

var post = new SqlParameter("@postId", postId);
var x = _context.Posts.FromSql("GetViewers @postId", post).ToList();

答案 1 :(得分:0)

似乎您需要以其他方式为存储过程添加参数。

看看下面的文档 https://www.entityframeworktutorial.net/efcore/working-with-stored-procedure-in-ef-core.aspx

var x = _context.Posts.FromSql("GetViewers @postId", postId).ToList();

对于这样的事情:

var param = new SqlParameter("@postId", postId);
var x = _context.Posts.FromSql("GetViewers @postId", param).ToList();

所以问题不在代码中,但显然Entity Framework Core在存储过程方面有一些限制

  1. 结果必须是实体类型。这意味着存储过程必须返回实体对应表的所有列。
  2. 结果不能包含相关数据。这意味着存储过程无法执行JOIN来表示结果。
  3. 插入,更新和删除过程无法与实体映射,因此SaveChanges方法无法为CUD操作调用存储过程。