EntityFrameworkCore中对Postgresql的并发处理
之前的EntityFramework版本中针对sql server处理并发是使用IsRowVersion,当然IsRowVersion也可以针对mysql来记录行版本号来处理并发问题,但是真对postgresql是没办法支持RowVersion的。因为postgresql中没有像mysql中那样有时间戳字段,而且可以设定如果行数据有更新,时间戳字段立马就会更新,如下图:

用sql语句则是:
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`rowversion` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000' ON UPDATE CURRENT_TIMESTAMP(6)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS=1;
在EntityFramework中,可以在OnModelCreating方法中,利用modelBuilder.Entity<TEntity>(t =>{t.Property<DateTime>("RowVersion").IsRowVersion().ValueGeneratedOnAddOrUpdate();})的方式来设置行版本号(这里利用了ef core中的影子属性,也就是在实体中其实并不存在RowVersion属性,但是可以添加到数据库字段)
那么在postgresql中我么则可以在OnModelCreating方法中利用modelBuilder.Entity<TEntity>(t.ForNpgsqlUseXminAsConcurrencyToken();})方法来设定类似的行版本,这样就可以实现ef的并发跟踪,其实在postgresql中,有一个隐藏的Xmin字段在每个表中,这个是专门用来记录版本的,当一行数据有更新,这个字段就会马上更新,但是这个字段是系统隐藏的,无法看到,ef这里的这个句话就是使用这个字段来作为行版本,同时启用并发跟踪。至于如何处理并发异常,可以在saveChanges方法中捕获DbUpdateConcurrencyException异常来处理。DbUpdateConcurrencyException的Entries对象记录了异常中的所有信息,包括原始的,当前的,以及数据库中的数据,这样就可以解决了。至于细节,打算找时间单独来写。
关于posgresql的ef并发问题,在百度根本找不到,但是在google一下子就找到。这里贴上npgsql的开源地址上的说明:https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/blob/master/doc/misc.md
第一次写,有不对的地方请指出。以后多多努力。

浙公网安备 33010602011771号