EF Core-自动设置字段值

时间:2018-09-01 01:04:18

标签: c# asp.net entity-framework refactoring entity-framework-core

我正在使用 ASP.NET Core + 实体框架Core 开发网络应用。

我想存储有关创建修改删除的更多信息。

我的EF实体实现的接口带有以下字段:

  • DateTime CreationTime { get; set; }
  • long? CreatorUserId { get; set; }
  • DateTime? ModificationTime { get; set; }
  • long? ModifierUserId { get; set; }
  • DateTime? DeletionTime { get; set; }
  • public long? DeleterUserId { get; set; }
  • bool IsDeleted { get; set; }
  • int TenantId { get; set; }

我一直在尝试让我的应用自动设置所有字段。

现在,我只能处理DateTime字段:

AppDbContext.cs

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
    ChangeTracker.DetectChanges();
    ChangeTracker.ProcessModifiedTime();
    ChangeTracker.ProcessSoftDelete();
    ChangeTracker.ProcessCreationTime();

    return (await base.SaveChangesAsync(true, cancellationToken));
}

ChangeTrackerExtensions.cs

public static class ChangeTrackerExtensions
{
    public static void ProcessCreationTime(this ChangeTracker changeTracker)
    {
        foreach (var item in changeTracker.Entries<ICreationTime>().Where(e => e.State == EntityState.Added))
        {
            item.CurrentValues[AppConsts.CreationTime] = DateTime.Now;
        }
    }

    public static void ProcessModifiedTime(this ChangeTracker changeTracker)
    {
        foreach (var item in changeTracker.Entries<IModificationTime>().Where(e => e.State == EntityState.Modified))
        {
            item.CurrentValues[AppConsts.ModificationTime] = DateTime.Now;
        }
    }

    public static void ProcessSoftDelete(this ChangeTracker changeTracker)
    {
        foreach (var item in changeTracker.Entries<ISoftDelete>().Where(e => e.State == EntityState.Deleted))
        {
            item.State = EntityState.Modified;
            item.CurrentValues[AppConsts.IsDeleted] = true;
            item.CurrentValues[AppConsts.DeletionTime] = DateTime.Now;
        }
    }
}

服务层控制器级别,可以每次分配所需的值({{1},CreatorUserId,{{1 }}),但这已成为例行任务,非常繁琐

我见过AspNetBoilerplate implementation,但令我感到担忧的是,开发人员使他们的DbContext依赖于Session和其他东西。

MofidierUserId

恕我直言,这是典型的违反单一责任原则

我尝试研究interceptors,但是它们似乎仅在 Entity Framework 的普通(非核心)版本中可用-仍然无法设法解决实现我上面提到的内容。

真的,我完全不知道如何使用Entity Framework Core处理它。谁能想到任何服务层级别的解决方案?还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

UserId和TenantId只是您的存储库服务(此处为DbContext)所需的数据片段。如果服务需要数据,则应将其注入服务中。

没有DI,您可以在DbContext上设置UserID和TenantID构造函数参数。使用DI,您可能会注入对提供此数据的服务的依赖。