Gần đây tôi đã chuyển từ EF Core 2.2 sang EF Core 3.0.
Thật không may, tôi đã không tìm thấy một cách để gọi một thủ tục được lưu trữ trả về một thực thể.
Trong EF Core 2.0, điều đó là có thể:
var spParams = new object[] { "bla", "xx" };
var createdPath = ModelContext.Paths.FromSql("AddNodeWithPathProc @p0, @p1", spParams).Single();
Trong EF Core 3.0, phương thức FromSQL
được thay thế bằng FromSqlRaw
. Tuy nhiên, tôi đã không quản lý để gọi thành công một thủ tục được lưu trữ và sau đó xử lý giá trị. Điều này hữu ích khi thủ tục được lưu trữ chèn dữ liệu vào cơ sở dữ liệu.
Vì vậy, trong EF Core 3.0, tôi sử dụng mã này:
var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0, @p1", spParams).Single();
nhưng nó sẽ đưa ra một ngoại lệ, vì SQL được tạo không hợp lệ và trông giống như thế này:
exec sp_executesql N'SELECT TOP(2) [p].[PathId], [p].[Level], [p].[NodeId], [p].[NodePath], [p].[NodePathString]
FROM (
@sql @p0, @p1
) AS [p]',N'@p0 nvarchar(4000),@p1 nvarchar(4000), @sql nvarchar(100)',@p0=N'1a',@p1=N'', @sql=N'AddNodeWithPathProc'
Tôi đã thử khá nhiều biến thể, nhưng không thành công.
Tôi bắt đầu nghĩ rằng không thể chạy các thủ tục được lưu trữ với ModelContext.[IQueryable].FromSqlRaw
. Theo tôi loại này đánh bại một trong những lý do chính FromSqlRaw
bởi vì, đối với các câu lệnh chọn bình thường, LINQ thường đủ tốt.
Có ai biết cách sử dụng các thủ tục được lưu trữ kết hợp với FromSqlRaw
trong EF Core 3.0 không? Bất kỳ trợ giúp nào cũng được đánh giá rất cao.
Cảm ơn trước
PS: Tôi biết bạn có thể thực hiện một thủ tục được lưu trữ với this.Database.ExecuteSqlRaw(SQL, parameters)
. Tuy nhiên, theo cách đó, không thể truy xuất bất kỳ thực thể nào mà các thủ tục được lưu trữ truy vấn.