При запуске процедуры в 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');
Поэтому, когда вы запускаете основную программу при отладке и устанавливаете прерыватель, вы заметите, что НИ ОДИН из объектов не возвращает значений, которые были обновлены процедурой при переходе к ее проверке. Во время отладки, если вы запустите оператор select для таблицы, вы увидите, что поле «Комментарий» действительно обновлено.
Почему это?