Я новичок в использовании EF Core. Насколько я понимаю, в EF Core есть «Отслеживание изменений», которое просматривает данные, чтобы увидеть, какие столбцы были изменены, и создает оператор SQL UPDATE, который обновляет только измененные столбцы, как описано в ответе здесь:
Сравнивает ли ядро EF значение для включения столбцов в оператор обновления?
Однако это не то, что я вижу. Например, у меня есть эта сущность:
public class Book
{
public int BookId { get; set; }
[StringLength(255)]
public string Title { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; }
[StringLength(500)]
public string Description { get; set; }
}
Затем я обновляю существующую строку следующим кодом:
class Program
{
static void Main(string[] args)
{
var context = new TestContext();
var book = context.Books.Find(1);
book.Title += " x";
context.Books.Update(book);
context.SaveChanges();
}
}
Я запустил SQL Profiler и запустил этот код. Я ожидал увидеть инструкцию UPDATE, которая обновляла только столбец «Заголовок», но он всегда обновлял каждый столбец:
exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Books] SET [AuthorId] = @p0, [Description] = @p1, [Title] = @p2
WHERE [BookId] = @p3;
SELECT @@ROWCOUNT;
',N'@p3 int,@p0 int,@p1 nvarchar(500),@p2 nvarchar(255)',@p3=1,@p0=1,@p1=N'',@p2=N'Some Title x'
Например, описание столбца не изменилось, хотя оно находится в операторе UPDATE, как AuthorId.
Почему это? Разве это не просто заголовок в предложении SET?