【发布时间】:2020-03-28 19:03:37
【问题描述】:
我对使用 EF Core 有点陌生。据我了解,EF Core 有一个“更改跟踪器”,它查看数据以查看哪些列已被修改并构建一个仅更新修改后的列的 SQL UPDATE 语句,如此处的答案所述:
Does EF core compares value to include columns in update statement?
但是,这不是我所看到的。例如,我有这个实体:
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'
例如,列 Description 未更改,但它在 UPDATE 语句中,就像 AuthorId 一样。
这是为什么呢?它不应该只是在 SET 子句中有 Title 吗?
【问题讨论】:
-
你不需要更新那一行。你认为你为什么需要它?
-
认为您需要调用 update 是一个常见的错误,但在这种情况下它不是必需的,实际上是导致您的问题的原因。以下是对差异的简单描述。 learnentityframeworkcore.com/dbcontext/modifying-data
-
谢谢,就这样!我知道它一定是我忽略的东西。 @ErikEJ,它在我找到的一些示例代码中。
-
不要相信你在互联网上找到的东西!