Sql server 无法理解实体Framewrok如何使用时间戳为更新操作生成SQL语句?

Sql server 无法理解实体Framewrok如何使用时间戳为更新操作生成SQL语句?,sql-server,entity-framework,asp.net-mvc-5,Sql Server,Entity Framework,Asp.net Mvc 5,我的asp.net mvc web应用程序中有以下方法: var rack = IT.ITRacks.Where(a => !a.Technology.IsDeleted && a.Technology.IsCompleted); foreach (var r in rack) { long? it360id = technology[r.ITRackID]; if (it360resource.Conta

我的asp.net mvc web应用程序中有以下方法:

var rack = IT.ITRacks.Where(a => !a.Technology.IsDeleted && a.Technology.IsCompleted);

foreach (var r in rack)
{
                long? it360id = technology[r.ITRackID];

                if (it360resource.ContainsKey(it360id.Value))
                {
                    long? CurrentIT360siteid = it360resource[it360id.Value];

                    if (CurrentIT360siteid != r.IT360SiteID)
                    {
                        r.IT360SiteID = CurrentIT360siteid.Value;
                        IT.Entry(r).State = EntityState.Modified;
                        count = count + 1;
                    }
                }

                IT.SaveChanges();
}
当我检查SQL Server profiler时,我注意到EF将生成以下SQL语句:

exec sp_executesql N'update [dbo].[ITSwitches]
set [ModelID] = @0, [Spec] = null, [RackID] = @1, [ConsoleServerID] = null, [Description] = null, [IT360SiteID] = @2, [ConsoleServerPort] = null
where (([SwitchID] = @3) and ([timestamp] = @4))
select [timestamp]
from [dbo].[ITSwitches]
where @@ROWCOUNT > 0 and [SwitchID] = @3',N'@0 int,@1 int,@2 bigint,@3 int,@4 binary(8)',@0=1,@1=539,@2=1502,@3=1484,@4=0x00000000000EDCB2
我不明白设立以下条文的目的:-

select [timestamp]
    from [dbo].[ITSwitches]
    where @@ROWCOUNT > 0 and [SwitchID] = @3',N'@0 int,@1 int,@2 bigint,@3 int,@4 binary(8)',@0=1,@1=539,@2=1502,@3=1484,@4=0x00000000000EDCB2

有人能提供建议吗?

实体框架使用时间戳检查行是否已更改。如果自上次EF检索该行以来该行发生了更改,则它知道该行存在并发问题

这里有一个解释:


实体框架使用时间戳检查行是否已更改。如果自上次EF检索该行以来该行发生了更改,则它知道该行存在并发问题

这里有一个解释:

这是因为EF(和您)希望通过新生成的rowversion值更新更新更新的客户端对象

首先执行更新。如果成功(因为rowversion仍然是客户端中的版本),数据库将生成一个新的rowversion,EF将检索该值。假设您立即想要进行第二次更新。如果没有新版本,那是不可能的

所有标记为标识或计算的属性(通过
databasegeneratedoption
)都会发生这种情况。

这是因为EF(和您)希望通过新生成的rowversion值更新更新更新的客户端对象

首先执行更新。如果成功(因为rowversion仍然是客户端中的版本),数据库将生成一个新的rowversion,EF将检索该值。假设您立即想要进行第二次更新。如果没有新版本,那是不可能的


所有标记为标识或计算的属性(通过
databasegeneratedoption
)都会发生这种情况。

您的表是否有一列
timestamp
数据类型?您的表是否有一列
timestamp
数据类型?是的,我知道,并且我知道EF将在THWHERE子句中包含时间戳。但我的问题是,它已经将时间戳添加到Where子句“Where([SwitchID]=@3)和([timestamp]=@4”)”,那么,为什么要包含“从[dbo].[ITSwitches]Where@@ROWCOUNT>0….”中选择[timestamp],是的,我知道,而且我知道EF将在THWHERE子句中包含时间戳。但我的问题是,它已经将时间戳添加到Where子句“Where([SwitchID]=@3)和([timestamp]=@4”)”,那么,为什么要包含“从[dbo].[ITSwitches]Where@@ROWCOUNT>0中选择[timestamp]”