Моя проблема в том, что я не могу мягко удалять объекты в коллекции 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;
}
}
}
}