У меня следующий случай. В системе, с которой я работаю, мне пришлось применить концепцию SoftDeleted
для сущности Account
. Это просто добавление логического флага с именем IsDeleted
к сущности Account
. В системе мы придерживаемся концепции, что все сущности, которые можно мягко удалить, применили фильтр запроса к полю IsDeleted
в DbContext, который также применяется при переносе БД. Определение правила выглядит следующим образом:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<WorkItem>().HasQueryFilter(w => !w.IsDeleted);
modelBuilder.Entity<Account>().HasQueryFilter(w => !w.IsDeleted);
...
}
WorkItem
выглядит следующим образом:
public class WorkItem : Entity, ICreationTracked, IModificationTracked
{
public string Name { get; set; }
public Guid ModifiedById { get; set; }
public virtual Account ModifiedBy { get; set; }
public Guid CreatedById { get; set; }
public virtual Account CreatedBy { get; set; }
}
Сущность Account
:
public class Account : IEntity<Guid>, IDeletionTracked
{
public Guid Id { get; set; }
public string Name { get; set; }
public bool IsDeleted { get; set; }
public virtual Account DeletedBy { get; set; }
public Guid? DeletedById { get; set; }
...
}
Там может быть случай, когда я запрашиваю некоторые рабочие элементы, и связанный UpdatedBy
Account
помечается как удаленный. В таком случае я хотел бы иметь возможность установить все поля таких Account
как «удаленные».
Для одного случая моей идеей было создать запрос вроде:
var query = Context
.WorkItems
.Select(x => new WorkItem()
{
Id = x.Id,
ModifiedBy = Context.Accounts.IgnoreQueryFilters().FirstOrDefault(a => a.Id == x.CreatedById)
...
})
.AsQueryable()
.FilterByNameAndDescription(filter);
Затем я смогу l oop через все WorkItems/UpdatedBy
(или CreatedBy
) и отобразить "Deleted"
как Account
s Name
, Login
, et c на основе ModifiedBy.IsDeleted
. Это работает нормально для одного случая, однако я обнаружил, что в целом система может удовлетворить десятки запросов, которые потребуют такой модификации. Это потребовало бы огромного количества работы!
Есть ли какой-нибудь умный способ создать что-то вроде SoftDeletedResolver
(предположительно на уровне dbContext), который изменит соответствующие поля Account
на "удаленные"? Пожалуйста, имейте в виду, что когда я запрашиваю Учетные записи, должен быть применен фильтр удаленного программного обеспечения. Дело только в связанных удаленных аккаунтах. Есть идеи, что я могу сделать? Приветствия