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 ...
随机推荐
- Maximum Size Subarray Sum Equals k LT325
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- python flask 项目结构
1. 今天学习遇到一个问题,以前项目比较简单,所有的@app.route 都是写在一个文件app.py 中的,然后启动也是在这个文件中启动app.run .但是我今天 想写一个新的模块, 于是我新启了 ...
- STL基础3:map
#include <iostream> #include <map> #include <string> using namespace std; #define ...
- jquery动态出操作select
var citys = {1:'北京',2:'上海',3:'广州',4:'深圳'}; $("#city option:gt(0)").remove(); for(var k in ...
- 20155312 2006-2007-2 《Java程序设计》第二周学习总结
20155312 2006-2007-2 <Java程序设计>第二周学习总结 课堂内容总结 git:版本控制 生活中的容灾备份 归纳思维.实验思维.计算思维 计算机:实现自动化 学会使用快 ...
- 假期训练五(poj-1077bfs+康拓展开,hdu-2577dp)
题目一:传送门 思路:主要是找到状态, 考虑字母有两种状态,大写和小写, 从小写变为大写的变化方式有两种:保持cap状态,或者按住shift键: 从小写变为大写也有一种变化方式:按住shift键: 看 ...
- Codeforces Round #546 (Div. 2) D 贪心 + 思维
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...
- Linux下启动tomcat报错RROR org.apache.catalina.core.StandardContext- Error starting static Resources java.lang.IllegalArgumentException: Document base /home/duiba/apache-tomcat/webapps/../webapps/manager do
部署项目的时候,重启tomcat,死活起不来,很郁闷,网上巴拉了半天,结合自己的情况,找到了原因: 错误日志信息: 2018-12-13 13:52:26,992 [main] INFO org.ap ...
- C#和java的对比及总结
1.Java里的AClass.class得到的Class<T>类的对象对应C#的typeof(AClass)得到的Type类型的对象:(但是C#如果要反射创建对象是用Type对象的Asse ...
- IP之ALTIOBUF仿真
这里实现了差分转单端的功能. 问题:差分信号的电平是怎样的?如果像平常一样不设置Pin Planner中的电平的话,编译会报错. 在Pin Planner中做了如下设置: `timescale 1 n ...