Entity framework 自跟踪实体与数据库中的时间戳列

Entity framework 自跟踪实体与数据库中的时间戳列,entity-framework,timestamp,self-tracking-entities,Entity Framework,Timestamp,Self Tracking Entities,在web应用程序的乐观并发场景中,我正在考虑为每个表提供时间戳列(sqlserver),与guid相当。然后,当在实体框架中用某个属性装饰时间戳列时,linqto实体将生成sql更新查询,如,其中id=@p0和timestamp=@p1。当返回的更新记录数为0时,我们检测到并发异常 在许多帖子中,我读到了关于自我跟踪实体的文章,这可能是一种替代或更好的解决方案。但是我没有看到与上面描述的“简单”时间戳方法相比的任何优势。除了数据库不可变且不提供时间戳列的场景之外 哪种解决方案更好?为什么 编辑

在web应用程序的乐观并发场景中,我正在考虑为每个表提供时间戳列(sqlserver),与guid相当。然后,当在实体框架中用某个属性装饰时间戳列时,linqto实体将生成sql更新查询,如
,其中id=@p0和timestamp=@p1
。当返回的更新记录数为
0
时,我们检测到并发异常

在许多帖子中,我读到了关于自我跟踪实体的文章,这可能是一种替代或更好的解决方案。但是我没有看到与上面描述的“简单”时间戳方法相比的任何优势。除了数据库不可变且不提供时间戳列的场景之外

哪种解决方案更好?为什么

编辑

尤里·塔拉班科正确地指出STE是另一个概念。 然而,zeeshanhirani的回答表明,并发检查是跟踪更改的主要动机之一


让我们重新表述一下这个问题:为什么有人会在“timestamp column”方法看起来容易得多的情况下使用STE概念进行并发检查。

这里混合了两个概念。STE根本不是关于并发性的

自跟踪实体只知道如何进行更改跟踪,以了解这些更改是如何进行的。所以您总是知道实体对象图的当前状态。您不需要调用额外的更改检测

这是什么

编辑:

“并发检查是跟踪更改的主要动机之一”

AFAIK STE和POCO共享相同的并发检查方法,这只会在发送到DB的update语句中产生额外的where条件。相当于:

UPDATE [schema].[table] 
     SET [prop1] = value1, ... 
     WHERE [key] = key_value 
          AND [concurrency_prop_1] = concurrency_prop1_old_value 
          AND [concurrency_prop_2] = concurrency_prop2_old_value

因此,跟踪变化的“主要动机”是跟踪N层应用程序中的变化。

您在这里混合了两个概念。STE根本不是关于并发性的

自跟踪实体只知道如何进行更改跟踪,以了解这些更改是如何进行的。所以您总是知道实体对象图的当前状态。您不需要调用额外的更改检测

这是什么

编辑:

“并发检查是跟踪更改的主要动机之一”

AFAIK STE和POCO共享相同的并发检查方法,这只会在发送到DB的update语句中产生额外的where条件。相当于:

UPDATE [schema].[table] 
     SET [prop1] = value1, ... 
     WHERE [key] = key_value 
          AND [concurrency_prop_1] = concurrency_prop1_old_value 
          AND [concurrency_prop_2] = concurrency_prop2_old_value

因此,跟踪变化的“主要动机”是跟踪N层应用程序中的变化。

自跟踪实体实际上与您描述的概念配合使用。当上下文不在时,STE基本上跟踪对象的更改。但是,当它使用WCF服务将其更改发送回服务器时,它会发送属性的当前值、实体的新状态以及主键列的原始值,实体数据模型中标记为Concurrency=Fixed的任何列的独立关联值和原始值。

自跟踪实体实际上与您描述的概念一起工作。当上下文不在时,STE基本上跟踪对象的更改。然而,当它使用WCF服务将其更改发送回服务器时,它会发送属性的当前值、实体的新状态以及主键列的原始值、独立关联值和实体数据模型中标记为Concurrency=Fixed的任何列的原始值。

,w.r.t.“主键列的原始值”:从不更改主键-更改设计(例如删除和添加)!顺便说一下,w.r.t.“主键列的原始值”:永远不要更改主键-更改设计(例如删除和添加)!很公平。但问题是:如果“timestamp”方法看起来更自然、更简单,为什么有人想在并发性检查中这样做呢?我认为没有人会为了并发性检查而选择STE。STE与并发无关。正如@zeeshanhinari指出的,“STEs使用”并发检查概念。它们确实通过网络发送并发令牌的原始值。否则,您将无法在多层应用程序的另一层上检查这些值。“其想法是创建智能实体对象,跟踪自身的变化和相关实体的变化。”这很公平。但问题是:如果“timestamp”方法看起来更自然、更简单,为什么有人想在并发性检查中这样做呢?我认为没有人会为了并发性检查而选择STE。STE与并发无关。正如@zeeshanhinari指出的,“STEs使用”并发检查概念。它们确实通过网络发送并发令牌的原始值。否则,您将无法在多层应用程序的另一层上检查这些值。“其想法是创建智能实体对象,以跟踪其自身的更改和对相关实体的更改。”