EF dane odłączone - usuwanie rekordów.

0

Mam problem z usuwaniem rekordów.

public class F { public virtual ICollection<FEvents> Events {get;set;} }
public class FEvents { public Guid Id {get;set; } // Key public Guid FId {get;set;} // ForeginKey }

Problem jest taki, że do repozytorium przesyłam nową kolekcję FEvents w obiekcie F i tutaj chce usunąć te, które nie występują w nowej kolekcji, dodać nowe.

Próbowałem kilka podejść:

  1. Działa dodawanie ale usuwanie nie - nie można dodać tego samego rekordu bo już jest.
dbEntity.Events = newEntity.Events.Select(...).ToList();
  1. Dodawanie nowych i usuwanie starych
// Dodawanie nowych:
dbEntity.Events.AddRange(eventsWhichAreInsideNewEntityAndNotInsidedbEntity); 

// Usuwanie
for(; ; ;) // kolekcja do usunięcia
dbEntity.Events.Remove(kolekcjaDoUsunięcia[index]);
// Tutaj dodatkowo próbowałem ustawić stan na "deleted"

W punkcie drugim pojawia się problem przy SaveChanges:

"The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted."

Sęk w tym, że nie chce ustawiać foregin key na null tylko wywalić rekord z tabli.

Jak tego dokonać?

0

Popraw formatowanie kodu :) bo domyślam się że ten klucz obcy nie jest wykomentowany i ogólnie ciężko się czyta ten post. Za dużo trzeba się domyślać.

// Tutaj dodatkowo próbowałem ustawić stan na "deleted"
Jaki stan?

Przykład usuwania zrobiony na szybko (EventStores to nazwa tabeli), możesz usuwać całe kolekcje nie musisz iterowac po każdym elemencie:

            var eventsToRemove = context.EventStores.Where(event => event.Id > 1).ToList();
            context.EventStores.RemoveRange(eventsToRemove);
            context.SaveChanges();

Natomiast jak masz relacje jeden -> wielu (F -> FEvents) to pamiętaj żeby usunąć rekord z F to w FEvents nie może być do niego klucza obcego (trzeba najpierw usunąć rekordy z FEvents) ewentualnie włączyć usuwanie kaskadowe w EF.

Na przykładzie u mnie EventStore to twoje F i CustomEvent to FEvent:

            var customEventToRemove = context.CustomEvents.Where(e => e.EventStore.Id == 1);
            context.CustomEvents.RemoveRange(customEventToRemove);

            var eventStoreToRemove = context.EventStores.Single(e => e.Id == 1);
            context.EventStores.Remove(eventStoreToRemove);
            context.SaveChanges();

Tip:
W EF staraj się używać int/long jako klucze zamiast Guid'ów

1 użytkowników online, w tym zalogowanych: 0, gości: 1