При выполнении процедуры в EF Core 3 с использованием FromSqlRaw
, которая обновляет значения в таблице, EF НЕ возвращает обновленные значения, когда я запрашиваю базу данных об этих измененных значениях.
Я был в состоянии воспроизвести это поведение. Для воспроизведения создайте новое консольное приложение c# с. net core 3.1.
Скопируйте и вставьте приведенный ниже код в ваш основной файл Program.cs:
using System;
using System.Linq;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
namespace EfCoreTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// testing proc
var dbContext = new TestContext();
var tables = dbContext.TestTables.ToList();
var updated = dbContext.TestTables
.FromSqlRaw("execute testProc @Id=@Id, @Comments=@Comments", new object[]
{
new SqlParameter("Id", 1),
new SqlParameter("Comments", "testing comments 2"),
})
.ToList();
var again = dbContext.TestTables.ToList();
}
}
public class TestTable
{
public int TestTableId { get; set; }
public string Comment { get; set; }
}
public class TestContext : DbContext
{
public DbSet<TestTable> TestTables { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=localhost\SQLEXPRESS;Database=TestDb;Trusted_Connection=True");
}
}
}
Убедитесь, что следующие установлены пакеты:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.SqlServer.Design
При необходимости измените строку подключения.
Выполните dotnet ef migrations add initial
Выполните dotnet ef database update
Выполните следующий код в вашей базе данных:
drop procedure if exists testProc
go
create procedure testProc
@Id int,
@Comments nvarchar(max)
as
begin
update dbo.TestTables
set Comment = @Comments
where TestTableId = @Id;
select * from dbo.TestTables;
end
go
INSERT INTO [dbo].[TestTables]
(Comment) VALUES ('Test Comment');
Поэтому, когда вы запустите программу Main на отладке и включите прерыватель, вы заметите, что ни один из объектов не возвращает значения, которые были обновлены процедурой при проверке go Это. Находясь в режиме отладки, если вы выполните оператор select для таблицы, вы увидите, что поле «Комментарий» действительно обновлено.
Почему это так?