Entity Framework Core 生成跟踪列-阴影属性
摘自:https://www.cnblogs.com/tdfblog/p/entity-framework-core-generate-tracking-columns.html
Ef Core 官方文档: https://docs.microsoft.com/zh-cn/ef/core/
文章列举了三种:读写属性、只读属性、不定义属性(阴影属性 Shadow )。
下面是摘的一种阴影属性简单实现:
一、添加阴影属性:
1. 在 OnModelCreating 方法中声明阴影属性:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.AddAuditableShadowProperties(); base.OnModelCreating(modelBuilder); }
2. 这里是 AddAuditableShadowProperties 实现:
public static readonly string CreatedByUserId = nameof(CreatedByUserId); public static readonly string ModifiedByUserId = nameof(ModifiedByUserId); public static readonly string CreatedDateTime = nameof(CreatedDateTime); public static readonly string ModifiedDateTime = nameof(ModifiedDateTime); public static void AddAuditableShadowProperties(this ModelBuilder modelBuilder) { var models = modelBuilder.Model .GetEntityTypes() .Where(e => typeof(IEntityBase).IsAssignableFrom(e.ClrType)); foreach (var entityType in models) { modelBuilder.Entity(entityType.ClrType) .Property<long?>(CreatedByUserId); modelBuilder.Entity(entityType.ClrType) .Property<long?>(ModifiedByUserId); modelBuilder.Entity(entityType.ClrType) .Property<DateTimeOffset?>(CreatedDateTime); modelBuilder.Entity(entityType.ClrType) .Property<DateTimeOffset?>(ModifiedDateTime); } }
二、修改阴影属性:
1. 重写 SaveChange 方法:
public override int SaveChanges() { ChangeTracker.DetectChanges(); //保存之前修改阴影属性 SetShadowProperties(); // for performance reasons, to avoid calling DetectChanges() again. ChangeTracker.AutoDetectChangesEnabled = false; var result = base.SaveChanges(); ChangeTracker.AutoDetectChangesEnabled = true; return result; } private void SetShadowProperties() { // we can't use constructor injection anymore, because we are using the `AddDbContextPool<>` var httpContextAccessor = this.GetService<IHttpContextAccessor>(); ChangeTracker.SetAuditableEntityPropertyValues(httpContextAccessor); }
2. 修改阴影属性:
public static void SetAuditableEntityPropertyValues(this ChangeTracker changeTracker, IHttpContextAccessor httpContextAccessor) { var httpContext = httpContextAccessor?.HttpContext; // var userAgent = httpContext?.Request?.Headers["User-Agent"].ToString(); // var userIp = httpContext?.Connection?.RemoteIpAddress?.ToString(); var now = DateTimeOffset.Now; var modifiedEntries = changeTracker.Entries<IEntityBase>().Where(x => x.State == EntityState.Modified); foreach (var modifiedEntry in modifiedEntries) { modifiedEntry.Property(ModifiedDateTime).CurrentValue = now; modifiedEntry.Property(ModifiedByUserId).CurrentValue = ; } var addedEntries = changeTracker.Entries<IEntityBase>().Where(x => x.State == EntityState.Added); foreach (var addedEntry in addedEntries) { addedEntry.Property(CreatedDateTime).CurrentValue = now; addedEntry.Property(CreatedByUserId).CurrentValue = ; } }
Entity Framework Core 生成跟踪列-阴影属性的更多相关文章
- Entity Framework Core 生成跟踪列
本文翻译自<Entity Framework Core: Generate tracking columns>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意:我使用的是 ...
- Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...
- entity framework core 生成 postgresql 数据库实体
.net core 2.0 使用db first 方式生成 表 和context PM 控制台运行命令出错 Scaffold-DbContext "Host=localhost;Databa ...
- 被Entity Framework Core的细节改进震撼了一下
今天用 SQL Server Profiler 查看 Entity Framework Core 生成的 SQL 语句时,突然发现一个细节改进,并且被它震撼了一下: exec sp_executesq ...
- Entity Framework Core Code First 项目实践
Entity Framework Core Code First 实践 任何一种技术的出现都是为了解决一系列特定的问题,只有了解了技术所要解决的关键问题,才能理解它的真正用途,之后,才能在实践中用好它 ...
- Entity Framework Core 使用HiLo生成主键
#cnblogs_post_body.cnblogs-markdown p img { max-width: 95%; } HiLo是在NHiernate中生成主键的一种方式,不过现在我们可以在Ent ...
- 对Entity Framework Core的一次误会:实体状态不跟踪
在 Entity Framework 中,当通过 EF 使用 LINQ 查询获取到一个实体(实际得到的是 EF 动态生成的实体类的代理类的实例)时,这个实体的状态默认是被跟踪的.所以,当你修改实体的某 ...
- Entity Framework Core 1.1 Preview 1 简介
实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本. 10月25日,Entity Framework Core 1.1 Preview 1发布了. 升级到 ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 读取关系数据
Reading related data¶ 9 of 9 people found this helpful The Contoso University sample web application ...
随机推荐
- openssl pem密钥文件rsa加密解密例子
准备工作 命令行加密解密,用与比对代码中的算法和命令行的算法是否一致 C:\openssl_test>openssl rsautl -encrypt -in data.txt -inkey pu ...
- 2017/2/16:自己ajax+json习惯性写法 代码拼接的写法 +json用post提交乱码的原因
1.先导入jquery的包 2.ajax的写法跟注意点 返回一个list的写法 代码拼接写法: html层: 2.script处 4:在你前面传递参数的时候没有遇到乱码问题的情况下,你使用json并且 ...
- UDDI
什么是 UDDI? UDDI 是一个独立于平台的框架,用于通过使用 Internet 来描述服务,发现企业,并对企业服务进行集成. UDDI 指的是通用描述.发现与集成服务 UDDI 是一种用于存储有 ...
- python里的字典和集合
一.字典 1.字典的定义 字典是不可变的,是用hash值来存储的.字典的key必须是不可变的(可哈希) dict = {key1:value1 , key2:value2} 2.字典的增删改查 增 直 ...
- SQL SERVER 如果判断text类型数据不为空
一个字段Remark的数据类型设置先设置为varcharr(255),后来考虑到扩展性需要将其定义为TEXT类型,但是SQL 语句报错. SQL 语句: SELECT * FROM ...
- ios alloc init 和 new 的区别
1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], ...
- jq无法获取a标签动态id
起初a标签是这样写的<a href="javascript:void(0)" id="${menu.id}" value="${menu.na ...
- Mybatis在oracle数据库中插入数据后返回自增值ID
1.将id设置成自增序列 CREATE OR REPLACE TRIGGER "DATALIB"."TRIG_USER_ADD" BEFORE INSERT O ...
- 机器学习P7
优化问题: https://www.cnblogs.com/liaohuiqiang/p/7805954.html KKT条件就是把高数里面求不等式约束条件问题的分类方法写成两个条件.
- CodeForces 946D Timetable (DP)
题意:给定 n,m,K,表示某个人一个周有 n 天,每天有 m 节课,但是他可以跳过 K 节课,然后下面每行一个长度为 m 个01字符串,0 表示该人在这一小时没有课,1 表示该人在这一个小时有课,每 ...