Ho avuto qualche problema con EntityFramework e il seguente datamodel (vedere lo schema semplificato).EntityFramework: CascadeOnDelete solo se l'oggetto parent è cancellato
Scopo materia può essere pensata come "contenitore principale". Ci sono Bill e BillRecord. Esiste un'associazione uno-a-molti da Bill a BillRecord. Precisamente, un Bill può fare riferimento a molti BillRecord (possibilmente 0) e un BillRecord può essere riferito a un massimo di una fattura.
1) Voglio essere in grado di eliminare un BillRecord ma non dovrebbe eliminare il Bill, se c'è un'associazione (è per questo che non ho impostato un OnCascadeDelete For Bill su entità BillRecords). Allo stesso modo, se elimino un Bill non voglio cancellare il BillRecord che potrebbe essere associato.
2) Tuttavia, quando elimino una questione voglio che tutto scompaia: la materia, Bill e BillRecords.
Con il seguente codice, riesco ad avere 1) a destra e 2) funziona se non c'è un BillRecord associato a un Bill, se ce n'è uno ottengo il seguente errore.
System.Data.SqlServerCe.SqlCeException: The primary key value cannot be deleted because references to this key still exist. [ Foreign key constraint name = FK_dbo.BillRecordDboes_dbo.BillDboes_BillId ]
Qui è la mia entità e la mia logica per OnModelCreating
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MatterDbo>().HasMany<BillRecordDbo>(s => s.BillRecordDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
modelBuilder.Entity<MatterDbo>().HasMany<BillDbo>(s => s.BillDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
}
public class MatterDbo
{
public MatterDbo()
{
BillDbos = new List<BillDbo>();
BillRecordDbos = new List<BillRecordDbo>();
}
public Guid Id { get; set; }
public virtual List<BillDbo> BillDbos { get; set; }
public virtual List<BillRecordDbo> BillRecordDbos { get; set; }
}
public class BillRecordDbo
{
public Guid Id { get; set; }
public Guid MatterId { get; set; }
public virtual MatterDbo Matter { get; set; }
public Guid? BillId { get; set; }
public virtual BillDbo Bill { get; set; }
}
public class BillDbo
{
public BillDbo()
{
BilledRecords = new List<BillRecordDbo>();
}
public Guid Id { get; set; }
public virtual List<BillRecordDbo> BilledRecords { get; set; }
public Guid MatterId { get; set; }
public virtual MatterDbo Matter { get; set; }
}
Naturalmente, quando si elimina una questione ho potuto verificare e rimuovere tutte le associazioni di Bill e BillRecords manualmente, ma penso che sarebbe un uso errato di EF.
Sto usando rivolte EntityFramework 6.0 e SQL CE .NET 4.0
Grazie mille.