Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用存储过程从SQL Server检索数据_C#_Entity Framework - Fatal编程技术网

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

C# 无法使用存储过程从SQL Server检索数据,c#,entity-framework,C#,Entity Framework,我创建了一个连接两个表的存储过程,只需要两个表中的几个字段 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.Employee

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

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。只需存储过程即可。

您遗漏了一个参数:

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

看起来您需要以不同的方式为存储过程添加参数

请查看下面的文档

对这样的事情:

var param = new SqlParameter("@postId", postId);
var x = _context.Posts.FromSql("GetViewers @postId", param).ToList();
所以问题不在代码中,但实体框架核心显然对存储过程有一些限制

  • 结果必须是实体类型。这意味着存储过程必须返回实体对应表的所有列
  • 结果不能包含相关数据。这意味着存储过程不能执行连接来表示结果
  • Insert、Update和Delete过程无法与实体映射,因此SaveChanges方法无法为CUD操作调用存储过程

  • 您需要显示一些必填字段-这意味着什么?好的,这取决于错误是什么,您没有提供。两个表都有多个必填字段。联接表所需的sp仅为3。这是我的问题,我如何在不这样做的情况下获得这些值。否决票是怎么回事?你能补充一个错误吗。此外,请尝试直接在mssql中执行此SP。另外,请附上一个带有映射的c#模型。显然,当
    发布时,您的过程不会返回post,而是返回employee。FromSql
    显然需要post。。。显然修复了使用
    Empkoyees.FromSql
    并返回
    Employee
    所需的所有字段,即使我使用Employees,我仍然会得到相同的错误,因为它会查找相同的必填字段。我有。我只是没有包括在内。请看我的编辑。我已经有了。我只是没有包括在内。请看我的编辑。谢谢。看来存储过程和EF核心有很多限制。结果不能包含相关数据。这意味着存储过程不能执行连接来表示结果。
    var param = new SqlParameter("@postId", postId);
    var x = _context.Posts.FromSql("GetViewers @postId", param).ToList();