【发布时间】:2021-10-29 10:41:13
【问题描述】:
您好,我在 EF Core 中执行存储过程时遇到问题。 程序有3个参数: Procedure
用户定义的表类型如下所示: User-Defined Table Type
当我尝试执行程序时,我总是出错:
找不到与 CLR 类型“SqlParameter[]”的关系类型的映射。
C#代码:
List<SqlParameter> parameters = new List<SqlParameter>(); ;
parameters.Add(
new SqlParameter("@id_zmiennej", 138)
{
SqlDbType = SqlDbType.Int
}
);
using (var dt = new DataTable())
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("wartosc", typeof(int));
DataRow dr = dt.NewRow();
dr["id"] = 2010;
dr["wartosc"] = 2010;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = 2011;
dr["wartosc"] = 2011;
dt.Rows.Add(dr);
SqlParameter parameter = new SqlParameter("@lata", dt)
{
SqlDbType = SqlDbType.Structured,
TypeName = "[dbo].[TabIntType]"
};
parameters.Add(parameter);
}
using (var dt = new DataTable())
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("wartosc", typeof(int));
DataRow dr = dt.NewRow();
dr["id"] = 10;
dr["wartosc"] = 10;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = 11;
dr["wartosc"] = 11;
dt.Rows.Add(dr);
SqlParameter parameter = new SqlParameter("@okresy", dt)
{
SqlDbType = SqlDbType.Structured,
TypeName = "[dbo].[TabIntType]"
};
parameters.Add(parameter);
}
var data = _context.Data.FromSqlRaw("dbo.GetData {0}", parameters).ToList();
有人可以帮我解决这个问题吗?
【问题讨论】:
-
您似乎在混合使用 EntityFramework 和非 EF 方法。虽然您可以在 EF 中调用 SPROC,但您似乎只是在使用 EF 来提供连接字符串。
-
我可以看到的问题:你需要
FromSqlRaw("dbo.GetData {0}", parameters.ToArray<object>())。不要丢弃DataTable,这是不必要的,会导致它在执行命令之前被清空。您还需要设置parameter.Direction = ParameterDirection.Input; -
谢谢@Charlieface,我只需添加
Direction = ParameterDirection.Input;并将_context.Data.FromSqlRaw("dbo.GetData {0}", parameters).ToList();更改为_context.Data.FromSqlRaw("dbo.GetData {0},{1},{2}", parameters.ToArray()).ToList();,它就开始工作了。
标签: c# sql .net-core stored-procedures entity-framework-core