Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server LINQ到SQL对象版本控制_Sql Server_Vb.net_Linq To Sql - Fatal编程技术网

Sql server LINQ到SQL对象版本控制

Sql server LINQ到SQL对象版本控制,sql-server,vb.net,linq-to-sql,Sql Server,Vb.net,Linq To Sql,我正在尝试创建一个LINQtoSQL类,该类表示其自身的“最新”版本 现在,这个实体表示的表有一个自动递增的ID,我想我应该给主键添加一个版本号。我从来没有做过这样的事,所以我不知道该怎么做。我希望能够从使用对象的人那里抽象出对象版本的概念。换句话说,您有一个表示最新版本的该实体的实例,并且每当提交任何更改时,都会以递增的版本号存储该对象的新副本 我应该如何处理这件事?最好的方法是停止并认真反思你的方法 如果要保留不同版本的“对象”,那么最好将其序列化为xml格式,并将其存储在xml列中,其中包

我正在尝试创建一个LINQtoSQL类,该类表示其自身的“最新”版本

现在,这个实体表示的表有一个自动递增的ID,我想我应该给主键添加一个版本号。我从来没有做过这样的事,所以我不知道该怎么做。我希望能够从使用对象的人那里抽象出对象版本的概念。换句话说,您有一个表示最新版本的该实体的实例,并且每当提交任何更改时,都会以递增的版本号存储该对象的新副本


我应该如何处理这件事?

最好的方法是停止并认真反思你的方法

如果要保留不同版本的“对象”,那么最好将其序列化为xml格式,并将其存储在xml列中,其中包含一个版本号字段

在围绕应用程序维护在sql server中维护版本化数据时,需要认真考虑

根据评论更新:

这些考虑因素包括:在未来的“版本”中无法删除字段或更改字段的数据类型。新字段要求为空,或者至少在DB中为其存储一个默认值。因此,您将无法在唯一索引中或作为主键的一部分使用它们

简而言之,应用程序唯一能做的就是扩展。前提是以前的代码层可以忽略扩展


这是桌面软件制造商多年来一直在努力解决的典型向后兼容性问题。这也是你想远离它的原因。

如果你能避免保留历史,那就这样做。这是一种痛苦

如果一个完整的历史是不可避免的(规范的财务和医疗数据等),考虑添加历史表。使用触发器将“版本”添加到历史记录表中。这样,您就不必依赖应用程序来确保记录版本—所有插入/更新/删除都会被捕获,而不管源是什么

如果你的应用程序需要与历史数据交互,请确保它是只读的。如果有人可以简单地更改事务历史记录,那么捕获它们是没有意义的

如果您的关注是并发更新,请考虑使用记录更改时间戳。当用户A和用户B都在中午查看记录时,他们获取记录的时间戳。当用户A更新记录时,她的时间戳与记录的时间戳相匹配,因此更新会进行,并且时间戳也会更新。当用户B在五分钟后更新记录时,他的时间戳与记录的时间戳不匹配,因此他警告说,自上次查看记录以来,记录已更改。也许它会自动重新加载

无论你决定什么,我都会避免将当前数据和历史数据相互混淆


根据评论触发资源:

  • Stackoverflow描述了一个
审核触发器的键是。这些表包含受插入、更新或删除影响的行。您可以使用它们来审核更改。比如:

CREATE TRIGGER tr_TheTrigger
ON [YourTable]
FOR INSERT, UPDATE, DELETE 
AS
    IF EXISTS(SELECT * FROM inserted)
    BEGIN
        --this is an insert or update
        --your actual action will vary but something like this
        INSERT INTO [YourTable_Audit]
            SELECT * FROM inserted
    END
    IF EXISTS(SELECT * FROM deleted)
    BEGIN
        --this is a delete, mark [YourTable_Audit] as required
    END
GO

相信我,我宁愿避免。不幸的是,出于法律原因,我们必须跟踪所有变化。我需要与应用程序中的历史数据进行交互,但我猜使用触发器不应该排除这一点,对吗?你的应用程序不会意识到触发器,所以它们不会限制你。它们只是处理历史记录的一种整洁方式,即使数据在应用程序之外更新。我喜欢这种方式。你能给我指一些与你的建议有关的信息吗?请记住,我从未使用过触发器,也不知道如何最好地使用触发器。我使用触发器方法在一些表上保存历史记录几年,没有任何问题。是的,我知道这些问题。我真诚地想远离这件事,但出于法律原因,我们必须这样做。如果他们只需要以某种“愚蠢”的格式归档数据,我会将其存储为一个巨大的字符串或其他东西,但应用程序需要与历史交互。