我正在使用 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处理它。谁能想到任何服务层级别的解决方案?还是有更好的方法?
答案 0 :(得分:1)
UserId和TenantId只是您的存储库服务(此处为DbContext)所需的数据片段。如果服务需要数据,则应将其注入服务中。
没有DI,您可以在DbContext上设置UserID和TenantID构造函数参数。使用DI,您可能会注入对提供此数据的服务的依赖。