Как мягко удалить записи в сущности с коллекцией в asp.net core 2? - PullRequest
0 голосов
/ 27 мая 2018

Моя проблема в том, что я не могу мягко удалять объекты в коллекции SavePartnerRegistryResource.это ресурсы моих сущностей,

public class SavePatientsRegistryResource {
     public long? PatientFileId { get; set; }
     public SavePatientsRegistryResource () {
     Partners = new Collection<SavePartnerRegistryResource> ();
     }
}
public class SavePartnerRegistryResource {
    public string RecordId { get; set; }
    public long? PatientFileId { get; set; }
    public long? PartnerFileId { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
}

То, как я это делаю, так это то, что я с нетерпением загружаю свои сущности в свой контроллер и использую automapper для сопоставления моего ресурса с моей сущностью.Я обрабатываю свою коллекцию (добавляю / удаляю) в AfterMap,

.AfterMap((s, d) = >{
    foreach(PartnerRegistry partner in d.Partners.ToList()) {
    SavePartnerRegistryResource modelPartner = s.Partners.FirstOrDefault(c = >c.PatientFileId == partner.PatientFileId && c.PartnerFileId == partner.PartnerFileId);
    if (!s.Partners.Contains(modelPartner)) {
        d.Partners.Remove(partner);
    }
}

. Удаление SavePatientsRegistryResource приведет к мягкому удалению самой сущности, а коллекцию НО удалит из коллекции SavePartnerRegistryResource будет жестко удалять запись вместо того, чтобы пометить ее как мягкое удаление.обе сущности получают свойство soft-delete при построении моделей.

Что мне здесь не хватает?

мой метод сохранения с переопределением -

public override Task < int > SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken =
default(CancellationToken)) {
        OnBeforeSaving();
        return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
    }

private void OnBeforeSaving() {
    foreach(var entry in ChangeTracker.Entries()) {
        if (!EntitiesToExclude().Contains(entry.Entity.ToString())) {
            switch (entry.State) {
            case EntityState.Added:
                entry.CurrentValues["IsDeleted"] = false;
                break;
            case EntityState.Deleted:
                entry.State = EntityState.Modified;
                entry.CurrentValues["IsDeleted"] = true;
                foreach(var navigationEntry in entry.Navigations.Where(n = >!n.Metadata.IsDependentToPrincipal())) {
                    if (navigationEntry is CollectionEntry collectionEntry) {
                        foreach(var dependentEntry in collectionEntry.CurrentValue) { (Entry(dependentEntry)).State = EntityState.Modified;
                            (Entry(dependentEntry)).CurrentValues["IsDeleted"] = true;
                        }
                    } else {
                        var dependentEntry = navigationEntry.CurrentValue;
                        if (dependentEntry != null) { (Entry(dependentEntry)).State = EntityState.Modified;
                            (Entry(dependentEntry)).CurrentValues["IsDeleted"] = true;
                        }
                    }
                }
                break;
            }
        }

    }

}

1 Ответ

0 голосов
/ 27 мая 2018

Мое решение:

Игнорировать коллекцию во время отображения, и я удалил модификации коллекции в AfterMap.

Я создал карту EqualityComparison, используя AutoMapper.Collection

CreateMap<SavePartnerRegistryResource, PartnerRegistry> ().EqualityComparison ((s, d) => s.PatientFileId == d.PatientFileId && s.PartnerFileId == d.PartnerFileId);

Я отображаю коллекцию в отдельном List,

List<PartnerRegistry> patientPartnersModelDataList = mapper.Map<List<SavePartnerRegistryResource>, List<PartnerRegistry>> (model.Partners.ToList (), patient.Partners.ToList ());

Теперь я могу получить добавленные / удаленные / измененные объекты следующим образом:

IEnumerable<PartnerRegistry> partnerRegistryToRemoveList = patient.Partners.ToList ().Except (patientPartnersModelDataList);
IEnumerable<PartnerRegistry> partnerRegistryToAddList = patientPartnersModelDataList.Except (patient.Partners.ToList ());
IEnumerable<PartnerRegistry> partnerRegistryToUpdateList = patient.Partners.ToList ().Intersect (patientPartnersModelDataList.ToList ());

, затем я запускаюforeach для итерации по каждой сущности, и я выполняю Add / Remove с использованием контекста, а не изменяю collection,

Для обновления я обновляю коллекцию вместо partnerRegistryToUpdateList

...