Zmagałem się z EF podczas próby odczytu rekordów, a następnie usunąłem te rekordy w tej samej transakcji. I początkowo stosując metodę EntityState.Deleted, która dałaby błąd:EntityState.Deleted nie działa, czy Remove (entity) to robi?
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.
Ale jeśli zmienię go lubić mam poniżej, używając .Wykręcić(), to wszystko jest dobrze.
- Jaka jest różnica i najlepsze czasy użycia .Usuń() kontra. Usunięto?
- Jak mogę wykonać tę pracę przy użyciu metody .Deleted? Próbowałem utworzyć nowe wystąpienie kontekstu do mojego repozytorium do odczytu i inne do usunięcia, ale następnie dostałem błędy związane z IEntityTracker nie można śledzić wielu wystąpień ... Próbowałem również. Włącz na początku odczytu, aby załadować zależne rekordy do EF, więc wie o nich i usuwa je. Próbowałem też. Najpierw odczytać zapisy odczytu. Wszystko bez skutku.
Oto metoda, o której mowa. Zauważ, że mam rodzajowe repozytorium, które wykorzystuje metodę .Deleted który służył mi dobrze, dopóki tego scenariusza (czytanie następnie usuwając te same rekordy.)
//Delete Allocation Need and AllocatedContainers for alloc need id
public ActionConfirmation<int> DeleteAllocRecords(int intFacilityId, AllocNeedSourceTypes needSourceType, int intNeedSourceId)
{
var context = new InventoryMgmtContext();
var repository = new AllocationNeedRepository(context);
//Delete Allocation Need and hence children in Allocated Containers
var srcType = needSourceType.ToString();
List<AllocationNeed> allocNeeds = repository.SearchFor(
x => x.FacilityId == intFacilityId
&& x.NeedSourceType == srcType
&& x.NeedSourceId == intNeedSourceId
).ToList();
//var deleteRepository = new Repository<AllocationNeed>(); <--tried separate instance of context to delete...no worky.
foreach (AllocationNeed allocNeed in allocNeeds)
{
try
{
//NO WORK: context.Entry(allocNeed).State = System.Data.EntityState.Deleted;
context.AllocationNeeds.Attach(allocNeed);
context.AllocationNeeds.Remove(allocNeed); <-- Works
context.SaveChanges();
}
catch (Exception ex)
{
return ActionConfirmation<int>.CreateFailureConfirmation(ex.Message, allocNeed.Id);
}
}
Nie ma prawdziwego powodu do użycia. Usunięto to, co wiem, poza tym, że już napisałem swoje ogólne repozytorium, aby użyć tej metody, ale jest to jedna linia kodu do zmiany, aby użyć metody .Remove, więc użyję tego . Dzięki! –
Usuń nie usuwa obiektów podrzędnych. Jeśli FK obiektu potomnego jest wartością NULL, ustawi wartość null, jeśli będzie to wymagane, wygeneruje wyjątek. Sposobem usuwania obiektów podrzędnych jest oznaczenie związku jako 'CascadeOnDelete' w kodzie pierwszym lub w db-pierwszym. – Shoe
^-> lub usuń z dołu do góry. – JoeBrockhaus