C# 行版本don';删除并重新插入后不匹配

C# 行版本don';删除并重新插入后不匹配,c#,sql-server,entity-framework,automapper,rowversion,C#,Sql Server,Entity Framework,Automapper,Rowversion,我有一个列为rowversion的表 我正在通过下面的查询获取数据 BEGIN TRANSACTION EVENTS Declare @eventId int Create table #tempEvents ( [EventID] [int] NOT NULL, ) Insert into #tempEvents ( [EventID] ) (Select top(@TopN) [EventID] FROM [dbo].[PolicyEventsOminibus] WIT

我有一个列为rowversion的表

我正在通过下面的查询获取数据

BEGIN TRANSACTION EVENTS 


Declare @eventId int
Create table #tempEvents
(
    [EventID] [int]  NOT NULL,
)
Insert into #tempEvents
(
[EventID] 
)
(Select top(@TopN) [EventID]   FROM [dbo].[PolicyEventsOminibus] WITH (UPDLOCK,READPAST) WHERE [PublishStatus] = @PublishStatus)

update [PolicyEventsOminibus] set [PublishStatus]=1 where Eventid in (Select #tempEvents.eventid from #tempEvents)

Select  [PolicyEventsOminibus].* FROM [dbo].[PolicyEventsOminibus] WITH (UPDLOCK,READPAST) where Eventid IN(Select #tempEvents.eventid from #tempEvents)

drop TABLE #tempEvents
commit TRANSACTION EVENTS
获取数据后,我将使用以下基于rowversion的查询更新状态

 Create   PROCEDURE [dbo].[Update_Events]
(
@Publishstatus int,
@PrevPublishstatus int,
@LastUpdatedTimeStamp varchar(100),
@EventID int,
@RowVersion rowversion  
) 
AS
Update PolicyEventsOminibus
SET
Publishstatus = @Publishstatus ,
LastUpdatedTimeStamp  = @LastUpdatedTimeStamp
where EventID = @EventID and [RowVersion] = @RowVersion and Publishstatus =@PrevPublishstatus
调用选择存储过程的C#代码

        public List<PolicyEventsOminibus> GetEventsFromOminibus(int publishStatus, int topN)
        {
            var dmvPlcyEvnts = this.contextObj.GetPolicyEventsOminibusbyEventsContext(publishStatus, topN);
            return (List<PolicyEventsOminibus>)dmvPlcyEvnts.ToList();
        }

        public virtual ObjectResult<PolicyEventsOminibus> GetPolicyEventsOminibusbyEvents(Nullable<int> publishStatus, Nullable<int> topN)
        {
            var publishStatusParameter = publishStatus.HasValue ?
                new ObjectParameter("PublishStatus", publishStatus) :
                new ObjectParameter("PublishStatus", typeof(int));

            var topNParameter = topN.HasValue ?
                new ObjectParameter("TopN", topN) :
                new ObjectParameter("TopN", typeof(int));

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<PolicyEventsOminibus>("GetPolicyEventsOminibusbyEvents", publishStatusParameter, topNParameter);
        }
public List getevents fromominibus(int publishStatus,int topN)
{
var dmvPlcyEvnts=this.contextObj.GetPolicyEventsOminibusbyEventsContext(publishStatus,topN);
return(List)dmvPlcyEvnts.ToList();
}
公共虚拟对象结果GetPolicyEventsMinibusByEvents(可为null的publishStatus,可为null的topN)
{
var publishStatusParameter=publishStatus.HasValue?
新的ObjectParameter(“PublishStatus”,PublishStatus):
新的ObjectParameter(“PublishStatus”,typeof(int));
var topNParameter=topN.HasValue?
新的ObjectParameter(“TopN”,TopN):
新的ObjectParameter(“TopN”,typeof(int));
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction(“GetPolicyEventsOminibusbyEvents”,publishStatusParameter,TopnPareter);
}
调用更新存储过程更新事件的C#代码

        public int UpdateEventPublishStatus(int eventId, int pubStatus, byte[] rowVersion, int? prevpubStatus)
        {
            int result = this.contextObj.UpdateDmvPolicyEventsOminibus(pubStatus, prevpubStatus, DateTime.Now.ToString("ddMMyyyyhhmmss"), eventId, rowVersion);
            return result;
        }

         public virtual int Update_DMVPolicyEventsOminibus(Nullable<int> publishstatus, Nullable<int> prevPublishstatus, string lastUpdatedTimeStamp, Nullable<int> eventID, byte[] rowVersion)
        {
            var publishstatusParameter = publishstatus.HasValue ?
                new ObjectParameter("Publishstatus", publishstatus) :
                new ObjectParameter("Publishstatus", typeof(int));

            var prevPublishstatusParameter = prevPublishstatus.HasValue ?
                new ObjectParameter("PrevPublishstatus", prevPublishstatus) :
                new ObjectParameter("PrevPublishstatus", typeof(int));

            var lastUpdatedTimeStampParameter = lastUpdatedTimeStamp != null ?
                new ObjectParameter("LastUpdatedTimeStamp", lastUpdatedTimeStamp) :
                new ObjectParameter("LastUpdatedTimeStamp", typeof(string));

            var eventIDParameter = eventID.HasValue ?
                new ObjectParameter("EventID", eventID) :
                new ObjectParameter("EventID", typeof(int));

            var rowVersionParameter = rowVersion != null ?
                new ObjectParameter("RowVersion", rowVersion) :
                new ObjectParameter("RowVersion", typeof(byte[]));

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("Update_DMVPolicyEventsOminibus", publishstatusParameter, prevPublishstatusParameter, lastUpdatedTimeStampParameter, eventIDParameter, rowVersionParameter);
        }
public int-UpdateEventPublishStatus(int-eventId,int-pubStatus,byte[]行版本,int?prevpubStatus)
{
int result=this.contextObj.updatedMVolicyEventsOMinibus(pubStatus、prevpubStatus、DateTime.Now.ToString(“ddMMyyyyhhmmss”)、eventId、rowVersion);
返回结果;
}
公共虚拟int更新\u DMVPolicyEventsOminibus(可为null的publishstatus、可为null的prevPublishstatus、字符串lastUpdatedTimeStamp、可为null的eventID、字节[]行版本)
{
var publishstatusParameter=publishstatus.HasValue?
新的ObjectParameter(“Publishstatus”,Publishstatus):
新的ObjectParameter(“Publishstatus”,typeof(int));
var prevPublishstatus参数=prevPublishstatus.HasValue?
新对象参数(“PrevPublishstatus”,PrevPublishstatus):
新的ObjectParameter(“PrevPublishstatus”,typeof(int));
var lastUpdatedTimeStampParameter=lastUpdatedTimeStamp!=null?
新的ObjectParameter(“LastUpdatedTimeStamp”,LastUpdatedTimeStamp):
新的ObjectParameter(“LastUpdatedTimeStamp”,typeof(string));
var eventIDParameter=eventID.HasValue?
新的ObjectParameter(“EventID”,EventID):
新的ObjectParameter(“EventID”,typeof(int));
var rowVersionParameter=rowVersion!=null?
新的ObjectParameter(“RowVersion”,RowVersion):
新的ObjectParameter(“RowVersion”,typeof(byte[]);
返回((IObjectContextAdapter)this).ObjectContext.ExecuteFunction(“Update_DMVPolicyEventsOminibus”、publishstatusParameter、prevPublishstatusParameter、lastUpdatedTimeStampParameter、eventIDParameter、rowVersionParameter);
}
但是更新只是第一次发生。如果删除该行并再次插入,然后运行上述存储过程(选择和更新),则无法更新状态,因为rowversion与DB值rowversion不匹配

我正在使用实体框架对象上下文ExecuteFunction执行更新存储过程

我不确定我们用来将实体映射到域模型的EF或自动映射器是否有问题

如果有人能帮我确定这个问题,我将不胜感激


如果您需要任何进一步的信息,请告诉我。

每次
rowversion
数据类型都将获得唯一的值,您不能指定此值。如果您需要能够删除一行并重新插入该行,并将其旧值保留在该列中,则您不能使用
rowversion
数据类型。但在删除并重新插入后,我将再次从数据库中获取新行,然后尝试更新。所以它应该检索新行版本值,对吗?你是对的,我误解了这个问题,对不起。你能发布从SELECT中检索数据并调用存储过程的c代码吗?这可能是罪魁祸首(EF缓存等)