W przypadku aplikacji przy użyciu kodu Pierwszy EF 5 beta mam:Czy EF może automatycznie usuwać dane osierocone, jeśli rodzic nie został usunięty?
public class ParentObject
{
public int Id {get; set;}
public virtual List<ChildObject> ChildObjects {get; set;}
//Other members
}
i
public class ChildObject
{
public int Id {get; set;}
public int ParentObjectId {get; set;}
//Other members
}
odpowiednie operacje CRUD wykonywane są przez repozytoria, w razie potrzeby.
W
OnModelCreating(DbModelBuilder modelBuilder)
mam je ustawić:
modelBuilder.Entity<ParentObject>().HasMany(p => p.ChildObjects)
.WithOptional()
.HasForeignKey(c => c.ParentObjectId)
.WillCascadeOnDelete();
Więc jeśli ParentObject
zostanie usunięty, jego ChildObjects są zbyt.
Jednakże, jeśli biegnę:
parentObject.ChildObjects.Clear();
_parentObjectRepository.SaveChanges(); //this repository uses the context
otrzymuję wyjątek:
Operacja nie powiodła się: Związek nie mógł być zmieniony, ponieważ jeden lub więcej obcych kluczowych właściwości nie jest -nullable. Gdy wprowadzana jest zmiana relacji, powiązana właściwość klucza obcego jest ustawiona na wartość pustą. Jeśli klucz obcy nie obsługuje wartości pustych, musi zostać zdefiniowana nowa relacja, właściwość klucza obcego musi mieć przypisaną inną wartość inną niż null lub obiekt niepowiązany musi zostać usunięty.
Ma to sens, ponieważ definicja jednostek obejmuje złamanie klucza obcego.
Czy mogę skonfigurować jednostkę, aby "czyściła się", gdy zostanie osierocona, lub musi ręcznie usunąć te ChildObject
s z kontekstu (w tym przypadku przy użyciu ChildObjectRepository).
szczęście, zespół EF [wie o tym] (http://blog.oneunicorn.com/2012/06/02/deleting-orphans-with-entity-framework/) i będzie prawdopodobnie pochodzić z wbudowane rozwiązanie, które nie wymaga modyfikacji elementów wewnętrznych – PinnyM