【发布时间】:2019-07-16 11:28:20
【问题描述】:
刚开始使用 .NET Core 并遇到一些无法解决的问题。 我有一个名为 GetLeads 的存储过程,其架构基本上返回
LEADID (INT)
SALENO (INT)
OFFICE (INT)
PACKAGE (NVARCHAR(4)
SALEDATE (DATETIME)
举个例子,在存储过程所在的同一个数据库中有一个名为 Prospects 的表。它的架构是
LEADID (INT)
FNAME (NVARCHAR(50))
LNAME (NVARCHAR(50))
ADDR1 (NVARCHAR(150))
ADDR2 (NVARCHAR(150))
EMAIL (NVARCHAR(200))
PHONENO (NVARCHAR(200))
CONTACTDATE (DATETIME)
根据文档,我可以使用上下文模型的 FromSql 方法来调用存储过程。但是,如果存储过程返回的模式只有少数(如果有的话)字段与进行调用的上下文模型相匹配,该怎么办?
如果我构造一个查询,例如:
var _ctx = new DbContext();
var pkgs = _ctx.Prospects.FromSql("EXEC dbo.GetPackages").ToList();
这显然会失败,因为返回的记录集不包含与 Prospects 模型相关的字段。
相反,使用类似的东西:
var pkgs = _ctx.Database.ExecuteSqlCommand("EXEC dbo.GetPackages");
同样没有意义,因为它只会返回受命令执行影响的记录数。
因此,.NET Core 中可用的 FromSql 方法显然有其限制,尽管它被记录为可用于进行存储过程调用。
理想情况下,我希望核心框架能够以与 .NET 框架中的 EF 大致相同的方式直接调用存储过程和函数并简化事情。但我意识到 Core 中还没有该功能。虽然我希望它最终会这样做。
无论如何,足够的漫无边际和重点。
在 .NET Core 中在这些情况下调用存储过程的最实用和最广泛接受的方式是什么?我知道 ADO.NET 是一种选择,但我严格地说是在使用 EF 的核心框架范式内
【问题讨论】:
-
使用 ExecuteNonQuery 并将 cmd 设置为:cmd.CommandType = System.Data.CommandType.StoredProcedure;
-
_ctx.Database.SqlQuery<YourModelThatFitsYourProcedureOutput>()呢? -
@Selvin per EF DatabaseFacade 不包含 SqlQuery 的定义
-
哦...那
_ctx.Query<YourModelThatFitsYourProcedureOutput>().FromSql() -
无法将“Microsoft.EntityFrameworkCore.Internal.InternalDbSet”类型的对象转换为“Microsoft.EntityFrameworkCore.DbQuery”类型。
标签: c# entity-framework stored-procedures .net-core