【发布时间】:2019-10-10 11:08:59
【问题描述】:
我有以下代码
var dbContext = Setup.ConfigureDBContext();
var wo = await dbContext.WorkOrders.Where(x => x.WorkOrderID == 88).SingleOrDefaultAsync();
var t = wo.Confidence;
wo.ModifiedDateTime = DateTime.UtcNow;
wo.Confidence = t;
await dbContext.SaveChangesAsync();
在上述查询中,我分配了相同的 Confidence,但更改了 ModifiedDateTime
EF 生成如下 SQL
exec sp_executesql N'SET NOCOUNT ON;
UPDATE [WorkOrders] SET [ModifiedDateTime] = @p0
WHERE [WorkOrderID] = @p1 AND [VersionStamp] = @p2;
SELECT [VersionStamp]
FROM [WorkOrders]
WHERE @@ROWCOUNT = 1 AND [WorkOrderID] = @p1;
',N'@p1 int,@p0 datetime,@p2 varbinary(8)',@p1=88,@p0='2019-10-09 15:33:06.343',@p2=0x0000000000582A52
请注意,EF 在更新语句中不包括Confidence 列。我假设,EF 必须将原始值与新值进行比较,如果有变化,则只在更新语句中包含这些列。
这是正确的假设吗?
我问这个问题是因为WorkOrder 表也有 4 个 nvarchar(max) 列。这些列中的数据是长字符串。如果我的假设是正确的,那么 EF 还必须比较这 4 列来决定这些列是否需要包含在更新查询中。而且这种比较会比较慢,并且可能会导致性能下降。然后我可以为这 4 列创建单独的卫星表。
【问题讨论】:
标签: entity-framework .net-core asp.net-core-2.0 asp.net-core-2.1 ef-core-2.0