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 ...
随机推荐
- wifi功能模块
1. API 10 Android2.3.3 不支持wifi代理设置. 2017-09-29 原来addOrUpdateNetwork之前,wifi配置并不会立即生效,要想立即生效,就要 wifiMa ...
- idea+tomcat 端口占用
ntelliJ IDEA和Tomcat整合注意事项(转) 这两天一直在学习IDEA这个开发工具,今天再整合tomcat的时候遇到了问题,运行时总是报错,说是8080端口被占用,把我就搞的郁闷了,我就尝 ...
- [C#]做服务使用Process启动外部程序没窗体
这几天会到一个需要,要时时侦测文件生成,并上传到Server上,侦测文件生成使用的FileSystemWatch.但是时时运行遇到了问题,程序可能会人为退出或者意外终止,使用一个进程监控程序的监程,也 ...
- svn checkout单个文件
http://www.letuknowit.com/archives/svn-checkout-single-file/ 有时候需要在svn版本仓库中某个比较上层的目录中(比如根目录)checkout ...
- 20155312 2006-2007-2 《Java程序设计》第三周学习总结
20155312 2006-2007-2 <Java程序设计>第三周学习总结 课堂内容总结 yyp复制上一行代码 5不是false statistics.sh换成.bat就可以在windo ...
- centos7 sqoop 1 搭建笔记
1.require : java环境,hadoop,hive ,mysql2.下载解压sqoop13.设置环境变量 export SQOOP_HOME=/data/spark/bin/sqoop ex ...
- 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)
传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...
- poj-1195(二维树状数组)
题目链接:传送门 题意:给出操作,按照操作进行. 思路:将树状数组设置为二维的就行了. 注意: (1)每次求出的面积是S(x2,y2)-S(x1-1,y2)-S(x2,y1-1)+S(x1-1,y1- ...
- Codeforces Round #541 (Div. 2) E 字符串 + 思维 + 猜性质
https://codeforces.com/contest/1131/problem/D 题意 给你n个字符串,字符串长度总和加起来不会超过1e5,定义字符串相乘为\(s*s1=s1+s[0]+s1 ...
- Codeforces Round #542(Div. 2) CDE 思维场
C https://codeforces.com/contest/1130/problem/C 题意 给你一个\(n*m\)(n,m<=50)的矩阵,每个格子代表海或者陆地,给出在陆地上的起点终 ...