首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

实体框架:如何使用rowversion字段为每个类继承启用一个表?

实体框架中,为每个类继承启用一个表,可以使用rowversion字段来实现。rowversion字段是一个自动更新的时间戳,每当表中的数据发生更改时,它会自动更新。这使得我们可以轻松地跟踪数据更改,并确保每个类继承启用一个表。

以下是如何使用rowversion字段为每个类继承启用一个表的步骤:

  1. 在表中添加rowversion字段:

在表中添加一个rowversion字段,例如:

代码语言:sql
复制

ALTER TABLE YourTable ADD rowversion rowversion;

代码语言:txt
复制

这将在表中添加一个名为rowversion的字段,并将其设置为自动更新。

  1. 创建一个基类,并将rowversion字段添加到基类中:

在实体框架中,可以创建一个基类,并将rowversion字段添加到基类中。例如:

代码语言:csharp
复制

public abstract class BaseEntity

{

代码语言:txt
复制
   public byte[] RowVersion { get; set; }

}

代码语言:txt
复制
  1. 让每个类继承基类:

将每个表对应的实体类继承基类,例如:

代码语言:csharp
复制

public class YourEntity : BaseEntity

{

代码语言:txt
复制
   // Your entity properties

}

代码语言:txt
复制
  1. 使用rowversion字段进行数据更新:

当更新数据时,需要将rowversion字段一起更新。例如:

代码语言:csharp
复制

using (var context = new YourContext())

{

代码语言:txt
复制
   var entity = context.YourEntities.Find(id);
代码语言:txt
复制
   entity.RowVersion = updatedRowVersion;
代码语言:txt
复制
   context.Entry(entity).State = EntityState.Modified;
代码语言:txt
复制
   context.SaveChanges();

}

代码语言:txt
复制

这将更新表中的rowversion字段,并确保每个类继承启用一个表。

通过以上步骤,可以使用rowversion字段为每个类继承启用一个表,并确保数据更改得到跟踪。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL定义(二)

通过指定数据类型ROWVERSION(%Library.RowVersion)的字段来创建RowVersion字段每个只能指定一个ROWVERSION数据类型字段。...创建1和3,每个都有一个ROWVERSION字段,并创建2没有一个ROWVERSION字段。在Table1中插入十行。这些行的ROWVERSION值是接下来的十个计数器增量。...每个串行计数器字段都维护自己的独立计数器。每当将一行插入中时,串行计数器字段都会从其自动增量计数器接收一个正整数,该行没有提供任何值(NULL)或值0。...每个只能指定一个%AutoIncrement数据类型字段。每当将一行插入中时,此字段都会从自动增量计数器接收一个正整数,该行没有提供任何值(NULL)或值0。...当这些在InterSystems IRIS数据库中保存并编译时,它们会自动投影到与定义相对应的关系中:每个代表一个每个代表一个每个属性代表一列,依此类推。

1.5K10

.NET EF Core(Entity Framework Core)

:创建实现了IEntityTypeConfiguration接口的实体配置,配置实体和数据库的对应关系 class BookEntityConfig : IEntityTypeConfiguration...修改结构 想要限制Title的最大长度50,Title字段设置“不可为空”,并且想增加一个不可为空且最大长度20的AuthorName(作者名字)属性。...1、首先在Book实体中增加一个AuthorName属性。...SQLServer数据库可以用一个byte[]类型的属性做并发令牌属性,然后使用IsRowVersion()把这个属性设置RowVersion类型,这样这个属性对应的数据库列就会被设置ROWVERSION...总结:如果有一个确定的字段要被进行并发控制,那么使用IsConcurrencyToken()把这个字段设置并发令牌即可;如果无法确定一个唯一的并发令牌列,那么就可以引入一个额外的属性设置并发令牌,并且在每次更新数据的时候

17411
  • asp.net core 系列之并发冲突

    本文介绍如何处理多个用户并发更新同一实体(同时)时出现的冲突 。...主要是两种:一种,检查属性并发冲突,使用 [ConcurrencyCheck] ;另一种,检测行的并发冲突,使用 rowversion 跟踪属性,如果在保存之前有修改,就报错 发生并发冲突的情况:   ...1.用户导航到实体编辑页面;   2.第一个用户的更改还未写入数据库之前,另一个用户更新同一实体;   此时,如果未启用并发检测,当发生更新时:   最后一个更新优先。...数据库和数据模型必须配置支持引发 DbUpdateConcurrencyException 。 检测属性的并发冲突 可使用 ConcurrencyCheck 特性在属性级别检测并发冲突。...注意:rowversion ,  1.它是 SQL Server 特定的。 其他数据库可能无法提供类似功能。 2.用于确定从数据库提取实体后未更改实体

    1.6K20

    01-EF Core笔记之创建模型

    EF是实体框架,它的实体会映射到关系型数据库中。所以通过关系型数据库的之间的关系更容易理解实体的关系。...继承 关于继承关系如何在数据库中呈现,目前有三种常见的模式: TPH(table-per-hierarchy):一张存放基和子类的所有列,使用discriminator列区分类型,目前EF Core...仅支持该模式 TPT(table-per-type ):基和子类不在同一个中,子类对应的中仅包含基的主键和基扩展的字段,目前EF Core不支持该模式 TPC(table-per-concrete-type...):基和子类不在同一个中,子类中包含基的所有字段,目前EF Core不支持该模式 EF Core仅支持TPH模式,基和子类数据将存储在同一个中。...使用有参构造函数需要注意: 参数名应与属性的名字、类型相匹配 如果参数中不具有所有字段,则在调用构造函数完成后,对未包含字段进行赋值 使用懒加载时,构造函数需要能够被代理访问到,因此需要构造函数public

    3.1K20

    .NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记

    上下文池可以通过重复使用上下文实例,而不是每个请求创建新实例,从而提高大规模方案(如 web 服务器)的吞吐量。...避免在维护状态的应用程序中使用上下文池。 例如,不应在请求之间共享的上下文中的私有字段。 在将上下文实例添加到池中之前,EF Core 仅重置它知道的状态。...和配置 实体类型:https://docs.microsoft.com/zh-cn/ef/core/modeling/entity-types?...tabs=data-annotations 按照约定,将名为 Id 或的属性 Id 配置实体的主键。...(推荐) Timestamp/rowversion一个属性,在每次插入或更新行时,数据库会自动其生成新值。

    75411

    sql server时间戳timestamp

    timestamp 一般用作给行加版本戳的机制。存储大小 8 字节。...rowversion 数据类型同义词不具有这样的行为。指定 rowversion 时必须提供列名。 一个只能有一个 timestamp 列。...备注 每个数据库都有一个计数器,当对数据库中包含 timestamp 列的执行插入或更新操作时,该计数器值就会增加。该计数器是数据库时间戳。...rowversion 的数据类型 timestamp 数据类型的同义词,并具有数据类型同义词的行为。 在 DDL 语句,请尽量使用 rowversion 而不是 timestamp。...,该字段会自动更新,可以理解类似自增字段 2、中含timespan列,只要改行数据任一字段发生变化,timespan类型就会发生改变。

    15510

    ORM中的继承关系映射全解——单继承体系、一实体一具体表、一实体一扩展、接口映射

    继承体系优点是读/写继承体系中的每个实体的数据,都只需操作一张,性能较好,并且,新增继承,或扩展实体属性都只需要增减一张字段就可以了,易于维护;主要缺点是,因为所有的实体共享一张中会有比较多的...这里,我们采用的是单继承体系方式,注意每个实体都映射到AllInOneTable这个,只不过对每个实体来说,只使用了AllInOneTable的部分字段。 ...一实体一具体表 所谓一实体一具体表就是每个实体对应一张数据,并且,每个数据冗余包含其父的所有属性字段,并且,子类和父共享相同的主键值。...其次,接口描述的是一种契约,换句话说,以仅仅包含属性的接口例,假设有一个包含字段A,B的接口,那么,一个实体继承这个接口,意味着,这个实体对应的数据包含相同类型的A,B字段。 ...我们常常发现,当按照传统的单继承的思路来设计继承体系时,尤其是,当脑袋中一直包含着让模型更适合使用ORM框架来持久化时,我们往往会忽略接口,而过度依赖基继承

    2.4K90

    SQL命令 CREATE TABLE(四)

    此 RowID 在内部使用,但未映射到类属性。默认情况下,它的存在仅在投影到 SQL 时可见。在这个投影的 SQL 中,会出现一个额外的 RowID 字段。...如果没有指定要复制的字段名,则不能使用将数据复制到重复中。 位图扩展索引 使用CREATE TABLE创建时,缺省情况下, IRIS会自动定义相应的位图范围索引。...IDENTITY标识字段 SQL自动每个创建一个RowID字段,其中包含一个系统生成的整数,作为唯一的记录id。...定义标识字段可防止将主键定义IDKEY。 与任何系统生成的ID字段一样,IDENTITY字段具有以下特征: 每个只能将一个字段定义IDENTITY字段。...否则,如果使用SqlRowIdPrivate=0(默认值)定义,则将RowID字段报告SQLPrimaryKey字段

    1.4K20

    数据类型(一)

    数据类型(一)指定 SQL 实体(如列)可以包含的数据类型。...在使用 CREATE TABLE 或 ALTER TABLE 定义字段时指定数据类型。定义 SQL 字段时,可以指定下表(左列)中列出的 DDL 数据类型。...重要提示:上面显示的每个 DDL 或 IRIS 数据类型表达式实际上都是一个连续的字符串。这些字符串可能包含空格字符,但通常不包含任何类型的空格。为了便于阅读,此中出现了一些空白。...如果字段“ABC”, 仅使用磁盘、全局缓冲区和私有进程内存中的那么多空间。即使使用 MAXLEN=1000 声明该字段,私有进程内存也不会为该字段分配那么多空间。...只为字段值的实际大小分配内存,而不管声明的长度如何。 过大的 MAXLEN 值可能会影响 ODBC 应用程序。

    86420

    从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper

    3.3 模拟 MappedStatement 注册 最后还是按照这个方向走,找一个合适的切入点把对应通用Mapper的MappedStatement注册进去。接下来会详细介绍我是如何实现的。 4....当具体的Mapper继承这个接口后,实体泛型 T 和主键泛型PK就已经确定了。我们需要拿到T的具体类型并把其成员属性封装为SQL,并定制MappedStatement。...5.2 Mapper 的元数据解析封装 为了简化代码,实体做了一些常见的规约: 实体名称的下划线风格就是对应的名,例如 UserInfo的数据库名就是user_info。...实体类属性的下划线风格就是对应数据库字段名称。而且实体内所有的属性都有对应的数据库字段,其实可以实现忽略。 如果对应Mapper.xml存在对应的SQL,该配置忽略。...其实大多数框架如果需要魔改时都遵循了这一个思路:把流程搞清楚,找一个合适的切入点把自定义逻辑嵌进去。

    70330

    SQL命令 INSERT(二)

    插入计数器值 可以有选择地将一个字段定义Identity。默认情况下,每当向中插入行时,此字段都会从自动递增的计数器接收整数。默认情况下,插入不能为此字段指定值。但是,此默认值是可配置的。...更新操作不能修改身份字段值。此计数器由截断操作重置。 可以选择将一个字段定义数据类型ROWVERSION。...不能为ROWVERSION字段插入用户指定的值、计算的值或默认值。此计数器无法重置。 可以有选择地将一个或多个字段定义数据类型SERIAL(%Library.Counter)。...但是,请注意,定义的持久化按字母顺序列出列。 私有行ID:定义时,RowID字段被定义公共或私有(隐藏)。默认情况下,DDL CREATE TABLE操作将RowID定义私有。...默认情况下,定义的持久化将RowID定义公共的;要使其成为私有的,必须在定义持久化时指定SqlRowIdPrivate关键字。 复制表的最简单方法是使用私有的RowID定义源和目标

    3.3K20

    使用动态SQL(七)

    选择项目Select-item元数据使用%SQL.Statement准备SELECT或CALL语句之后,可以通过显示所有元数据或指定各个元数据项来返回有关查询中指定的每个选择项列的元数据。...TabletableNameSQL名称。即使指定了别名,也始终在此处列出实际的名。如果SELECT项是表达式或聚合,则不会列出任何名。如果SELECT项是子查询,则列出子查询名称。...9: HiddenisHidden如果使用%PUBLICROWID或SqlRowIdPrivate = 0(默认值)定义,则RowID字段返回N。否则,RowID字段返回Y。...12: RowIDisRowIdROWID和Identity字段返回Y.扩展列信息元数据表列出了每个选定字段的列名称(SQL名称或列别名),链接属性(链接的持久性类属性)和类型(数据类型)。...请注意,链接属性列出了持久性名(不是SQL名)和属性名(不是列别名)。

    84620

    SqlAlchemy 2.0 中文文档(五十二)

    注意 中只能有一个 IDENTITY 列。当使用 autoincrement=True 启用 IDENTITY 关键字时,SQLAlchemy 不会防止多个列同时指定该选项。...## 传统模式模式 非常旧版本的 MSSQL 方言引入了这样的行为,即在 SELECT 语句中使用模式限定的时,将自动其设置别名;给定一个: account_table = Table(...__init__ 方法继承 构造一个 TIMESTAMP 或 ROWVERSION 类型。 参数: convert_int – 如果 True,则在读取时将二进制整数值转换为整数。...__init__ 方法继承 构造一个新的DateTime。 参数: 时区 – 布尔值。指示日期时间类型是否应在仅在基础日期/时间持有类型上可用时启用时区支持。...注意 上只能有一个 IDENTITY 列。当使用autoincrement=True启用 IDENTITY 关键字时,SQLAlchemy 不会阻止多个列同时指定该选项。

    38710

    SQL命令 INSERT(三)

    源系统上的字段可能不是只读的,但如果IRIS将链接字段定义只读,则尝试引用此字段的INSERT将导致SQLCODE-138错误。 字段值: 每个字段值都必须通过数据类型验证。...如果定义了数据类型ROWVERSION字段,则在插入行时会自动其分配系统生成的计数器值。尝试将值插入ROWVERSION字段会导致SQLCODE-138错误。...要在客户端中启用或禁用Fast Insert,请在实例的定义中使用FeatureOption属性,如下所示: Properties p = new Properties(); p.setProperty...该一个显式定义的多字段IDKEY索引。 该一个SERIAL (%Counter)、AUTO_INCREMENT或%RowVersion字段。...传统SQL锁升级:使用“E”类型锁升级的最可能的原因是存在一个多属性IDKey索引。 在本例中,每个%Save都会增加锁计数器的值。

    2.4K10

    如何用ORM支持SQL语句的CASE WHEN?

    所以,对SOD框架而言,对应ORM如何支持CASE WHEN,就等于是问OQL如何支持CASE WHEN了。...启用":"停用" } } } 在这里,HName,IsEnable 这样的属性,SOD框架称为“持久化属性”,因为它MAP了Tb_User字段IsEnable ,该字段称为“持久化属性字段...这个持久化属性,对持久化属性进行“计算”,因此,我们这里称呼这样的属性实体的“计算属性”。...使用“计算属性”来支持CASE WHEN效果 前面说过,实体的“计算属性”本质上不是一个“持久化属性”,它是对持久化属性的计算处理,原理上非常类似SQLServer上面的计算列。...因此,在SOD框架使用“计算属性”,有一个必须注意的原则:“计算属性”不可以出现在OQL语句中。

    2.1K80
    领券