asp.net-core - 如何覆盖 ef 核心以自动写入数据或记录到文件?
问题描述
我正在使用 asp.net 核心 + ef 核心。我可以将删除获取或更新数据添加到数据库。
但是,当我执行这些操作时,它可以自动将用户信息记录到文件或数据库中datetime
吗?
如果我正在更新数据,数据将自动更新LastModifiedDateTime
andModifyUserId
属性。
或将其记录到文件中?
例如:如果我更新数据库
await _context.SaveChangesAsync(cancellationToken);
我可以做这个:
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
{
foreach (var entry in ChangeTracker.Entries<AuditableEntity>())
{
switch (entry.State)
{
case EntityState.Added:
entry.Entity.CreatedBy = _currentUserService.UserId;
entry.Entity.Created = _dateTime.Now;
break;
case EntityState.Modified:
entry.Entity.LastModifiedBy = _currentUserService.UserId;
entry.Entity.LastModified = _dateTime.Now;
break;
}
}
return base.SaveChangesAsync(cancellationToken);
}
不需要我指定属性但覆盖它以自动记录它吗?
如何设置每个实体的属性?然后我可以知道何时以及由谁进行更新?
解决方案
创建新的基础模型类。每个模型必须至少有一个或多个相同的列,例如 ID、CreatedBy 等。然后将基本模型与所有模型链接。
基本模型.cs
public class BaseModel
{
public int ID { get; set; }
public DateTime? Created { get; set; }
public string CreatedBy { get; set; }
public DateTime? LastModified { get; set; }
public string LastModifiedBy { get; set; }
}
用户.cs
public class User : BaseModel
{
public string Name { get; set; }
public int Age {get; set; }
}
YourDbContext.cs
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
{
var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseModel && (x.State == EntityState.Added || x.State == EntityState.Modified));
DateTime dt = DateTime.Now;
foreach (var entity in entities)
{
if (entity.State == EntityState.Added)
{
((BaseModel)entity.Entity).CreatedBy = _currentUserService.UserId;
((BaseModel)entity.Entity).Created = dt;
}
else if (entity.State == EntityState.Modified)
{
((BaseModel)entity.Entity).ModifiedBy = _currentUserService.UserId;
((BaseModel)entity.Entity).LastModified = dt;
}
}
return base.SaveChangesAsync(cancellationToken);
}
推荐阅读
- python - python 3 - getpass.getpass() 正在回显密码......似乎没有任何效果
- git - Git - 在 Windows 上克隆本地存储库
- javascript - 将 Json 对象转换为 html
- angular - 如何在 Angular 中转换 ControlValueAccessor 的值?
- git - 在 GitHub 中更改分支后创建新版本
- c++ - 按边长递归搜索图中所有可行路径
- javascript - 调试时更新比发布版本慢
- flutter - 如何使我的 Flutter 应用程序也可以作为模块应用程序工作?
- c# - 如何使用 Join 与实体框架 Lambda 和 Linq 在两个或多个表中进行搜索
- css - CSS 为什么宽度不对?