2015-01-30 6 views
5

Ho avuto qualche problema con EntityFramework e il seguente datamodel (vedere lo schema semplificato).EntityFramework: CascadeOnDelete solo se l'oggetto parent è cancellato

enter image description here

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.

risposta

1

Se è davvero necessario che BillRecord rimanga nel database se il suo genitore, entità Bill, viene eliminato, è necessario impostare la proprietà padre su null prima di eliminare il genitore. Tuttavia, avere un FK Null nel database è spesso un segno che potrebbe esserci una migliore soluzione di progettazione db.

Problemi correlati