C# 如何绕过NHibernate版本控制更新SQL中的记录

C# 如何绕过NHibernate版本控制更新SQL中的记录,c#,sql,nhibernate,proxy,C#,Sql,Nhibernate,Proxy,假设我有一个带有timestamp列的表,它通过NHibernate来管理记录版本,现在我正在寻找一种方法来更新我的数据记录,而不增加ts列的值,因为正如您所知,在每个update语句之后,该值都会增加,以跟踪数据的版本,从而避免并发问题 CREATE TABLE [dbo].[TSTest]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [ts] [timestamp] NOT NULL, CONST

假设我有一个带有
timestamp
列的表,它通过
NHibernate
来管理记录版本,现在我正在寻找一种方法来更新我的数据记录,而不增加ts列的值,因为正如您所知,在每个update语句之后,该值都会增加,以跟踪数据的版本,从而避免并发问题

CREATE TABLE [dbo].[TSTest]( 
    [ID] [int] NOT NULL, 
    [Name] [nvarchar](50) NULL, 
    [ts] [timestamp] NOT NULL, 
    CONSTRAINT [PK_TSTest] PRIMARY KEY CLUSTERED ( [ID] ASC )
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY]
有什么想法吗

有什么想法吗

根据您的注释和架构,您的
ts
[ts][timestamp]不为NULL
。所以每次更新操作都会对其进行修改

一种方法是在更新后使用
触发器并撤消所发生的修改。但你为什么要这么做?此外,MySQL不支持相同表上的触发器(或递归触发器)

有什么想法吗

根据您的注释和架构,您的
ts
[ts][timestamp]不为NULL
。所以每次更新操作都会对其进行修改

一种方法是在更新后使用
触发器并撤消所发生的修改。但你为什么要这么做?此外,MySQL不支持同一表上的触发器(或递归触发器)。

如果某些列不应进行
时间戳
跟踪,则可以将这些列移到新表中,然后再引用此原始表

如果需要,您可以通过生成一个名为
TSTest
的视图(以及将插入、更新和删除应用到相应的基表的触发器)来隐藏此新表和修改后的原始表的存在

然而,在这种情况下,我们不清楚应该做什么,因为只有一个明显的“可更新”列-
Name
,因此,如果我们不希望它受到
时间戳
跟踪的影响,我们根本不清楚为什么要将它放在这个表上

不幸的是,没有其他T-SQL机制可以避免时间戳的行为,这通常被视为一件好事。您不能通过触发器执行任何操作,因为如果您实际触摸基表,
时间戳
将被更改,并且不允许
更新
时间戳列,因此您甚至无法在更改后重置它


我认为这是可能的,在软件中没有什么是不可能的

撇开诸如停顿问题之类的存在不谈,你当然正确地认为这个问题是可以解决的——但不是以一种可能对你有用的方式。正如我上面所说的,通过T-SQL是不可能的

如果确实需要这样做,那么可以通过直接操作数据库文件来完成。当然,这需要您分离数据库或关闭服务器,然后仔细检查文件结构,手动查找包含要更改的行的页面,然后应用这些更改,然后更正结构的其他部分(如页面校验和)这样SQL Server就不会认为页面现在已损坏

我并不是真的提倡这种方法,只是概述了要真正执行您所要求的操作,您必须离正常状态有多远。

如果某些列不应进行
时间戳
跟踪,那么您可以将这些列移到一个新表中,然后再引用此原始表

如果需要,您可以通过生成一个名为
TSTest
的视图(以及将插入、更新和删除应用到相应的基表的触发器)来隐藏此新表和修改后的原始表的存在

然而,在这种情况下,我们不清楚应该做什么,因为只有一个明显的“可更新”列-
Name
,因此,如果我们不希望它受到
时间戳
跟踪的影响,我们根本不清楚为什么要将它放在这个表上

不幸的是,没有其他T-SQL机制可以避免时间戳的行为,这通常被视为一件好事。您不能通过触发器执行任何操作,因为如果您实际触摸基表,
时间戳
将被更改,并且不允许
更新
时间戳列,因此您甚至无法在更改后重置它


我认为这是可能的,在软件中没有什么是不可能的

撇开诸如停顿问题之类的存在不谈,你当然正确地认为这个问题是可以解决的——但不是以一种可能对你有用的方式。正如我上面所说的,通过T-SQL是不可能的

如果确实需要这样做,那么可以通过直接操作数据库文件来完成。当然,这需要您分离数据库或关闭服务器,然后仔细检查文件结构,手动查找包含要更改的行的页面,然后应用这些更改,然后更正结构的其他部分(如页面校验和)这样SQL Server就不会认为页面现在已损坏


我并不是真的提倡这种方法,只是概述了要真正实现您的要求,您必须离正常状态有多远。

不,您不能。我认为这是可能的,在软件中没有什么是不可能的!谢谢你编辑@Sergno,你不能。我认为这是可能的,软件中没有什么是不可能的!感谢您编辑@SergCREATE TABLE[dbo].[TSTest]([ID][int]NOT NULL,[Name][nvarchar](50)NULL,[ts][timestamp]NOT NULL,约束[PK_TSTest]主键群集([ID]ASC),并在[PRIMARY]上(PAD_INDEX=OFF,STATISTICS_norecomputer=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON,ON[PRIMARY]否,它是一个
时间戳
(又称
行版本
)列,而不是日期时间。因此,提到
当前时间戳
和t