gpt4 book ai didi

c# - Entity Framework Core 创建和更新字段

转载 作者:太空狗 更新时间:2023-10-29 19:59:24 26 4
gpt4 key购买 nike

我的所有实体都有四个自定义字段。这四个字段是 CreatedByCreatedDateUpdatedByUpdatedDate

有没有一种方法可以挂接到 Entity Framework 核心事件,以便在插入时使用当前 DateTimeCreatedBy 填充 CreatedDate > 与当前用户?当数据库有更新时,它会用当前的 DateTime 填充 UpdatedDate 并用当前用户填充 UpdatedBy

最佳答案

基本上 @Steve 的方法是可行的方法,但它的当前实现使得很难对您的项目进行单元测试。

通过一点重构,您可以使其单元测试友好并忠于 SOLID 原则和封装。

这是 Steve 示例的重构版本

public abstract class AuditableEntity
{
public DateTime CreatedDate { get; set; }
public string CreatedBy { get; set; }
public DateTime UpdatedDate { get; set; }
public string UpdatedBy { get; set; }
}

public class AuditableDbContext : DbContext
{
protected readonly IUserService userService;
protected readonly DbContextOptions options;
protected readonly ITimeService timeService;

public BaseDbContext(DbContextOptions options, IUserService userService, ITimeService timeService) : base(options)
{
userService = userService ?? throw new ArgumentNullException(nameof(userService));
timeService = timeService ?? throw new ArgumentNullException(nameof(timeService));
}

public override int SaveChanges()
{
// get entries that are being Added or Updated
var modifiedEntries = ChangeTracker.Entries()
.Where(x => (x.State == EntityState.Added || x.State == EntityState.Modified));

var identityName = userService.CurrentUser.Name;
var now = timeService.CurrentTime;

foreach (var entry in modifiedEntries)
{
var entity = entry.Entity as AuditableEntity;

if (entry.State == EntityState.Added)
{
entity.CreatedBy = identityName ?? "unknown";
entity.CreatedDate = now;
}

entity.UpdatedBy = identityName ?? "unknown";
entity.UpdatedDate = now;
}

return base.SaveChanges();
}
}

现在很容易为单元测试模拟时间和用户/主体,并且模型/域/业务层没有 EF Core 依赖性,更好地封装您的域逻辑。

当然,可以通过使用策略模式进一步重构它以使用更加模块化的方法,但这超出了范围。您还可以使用 ASP.NET Core Boilerplate,它还提供可审计(和软删除)EF Core DbContext(herehere)的实现

关于c# - Entity Framework Core 创建和更新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43314620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com