Quando esiste una associazione di tipo master/detail tra due entità con molteplicità (1 a *), è probabile che si voglia definire una regola che, in seguito all'eliminazione di un master, elimini automaticamente tutti suoi i detail.
Per farlo è sufficiente impostare la OnDelete action all'interno dell'associazione, nella definizione del modello concettuale
<Association Name="FK_VAL_CAMP_TST_CAMP">
<End Role="TST_CAMP" Type="LottiModel.Lotto" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="VAL_CAMP" Type="LottiModel.CaratteristicaLotto" Multiplicity="*" />
</Association>
Come si vede dall'esempio, OnDelete va definita sull'End master della associazione.
Una nota in più (un po' dolente in effetti) è che per fare in modo che questa definizione abbia effetto, EF richiede che le entity detail siano tutte caricate, ovvero se ho caricato un istanza di Master devo includere (o caricare in modo Deferred) anche tutti i suoi detail, prima di richiamare la DeleteObject
var lottoToDelete = (from l in this.dataContext.LottoSet.Include("Caratteristiche")
where l.IdLotto == key
select l).First();
this.dataContext.DeleteObject(lottoToDelete);
this.dataContext.SaveChanges();
Matteo
Technorati Tag:
Entity Framework