6

iniziato una nuova applicazione ASP.NET MVC 3 e ottenere il seguente errore:Come eliminare un record con un vincolo di chiave esterna?

The primary key value cannot be deleted because references to this key still exist.

Come risolvere questo problema?

modelle (codice-prima EF)

public class Journal 
{ 
    public int JournalId { get; set; } 
    public string Name { get; set; } 
    public virtual List<JournalEntry> JournalEntries { get; set; } 
} 
public class JournalEntry 
{ 
    public int JournalEntryId { get; set; } 
    public int JournalId { get; set; } 
    public string Text { get; set; } 
} 

Configurazione controller

// 
// POST: /Journal/Delete/5 

[HttpPost, ActionName("Delete")] 
public ActionResult DeleteConfirmed(int id) 
{    
    Journal journal = db.Journals.Find(id); 
    db.Journals.Remove(journal); 
    db.SaveChanges(); // **exception occurs here** 
    return RedirectToAction("Index"); 
} 

DB

public class FoodJournalEntities : DbContext 
{ 
    public DbSet<Journal> Journals { get; set; } 
    public DbSet<JournalEntry> JournalEntries { get; set; } 
} 
+1

Nel database è possibile scegliere l'opzione di eliminazione a cascata per la tabella padre? – Pankaj

+0

La tua risposta potrebbe essere [qui] (http://stackoverflow.com/a/5522422/60761) già. In caso contrario, inserisci il codice DbSetup. È possibile rimuovere la vista. –

+0

@PankajGarg - Ho verificato che il database abbia già questo set. –

risposta

15

trovato la soluzione:

public class FoodJournalEntities : DbContext 
{ 
    public DbSet<Journal> Journals { get; set; } 
    public DbSet<JournalEntry> JournalEntries { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Journal>() 
       .HasOptional(j => j.JournalEntries) 
       .WithMany() 
       .WillCascadeOnDelete(true); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

Source

+0

oh fantastico, hai risposto a te stesso :) –

+0

+1 punto per quello –

+0

@ 白 ジ ェ ー ム ス sei davvero "13" anni? –

7

Se si elimina un rec ord da una tabella (diciamo "blah"), che ha altre relazioni con altre tabelle (xyz, abc). Per impostazione predefinita, il database ti impedirà di eliminare una riga in "blah" se ci sono righe correlate in una delle altre tabelle.
Soluzione n. 1:
È possibile eliminare manualmente le righe correlate, questo potrebbe richiedere molto lavoro.
Soluzione n. 2:
una soluzione semplice è configurare il database per eliminarli automaticamente quando si elimina una riga "blah".

Seguire questa aprire il diagramma di database, e fare clic sulle proprietà sul rapporto

enter image description here

Nella finestra Proprietà, espandere INSERT e UPDATE Specifiche e impostare la DeleteRule proprietà di Cascade.
enter image description here

Salvare e chiudere lo schema. Se ti viene chiesto se desideri aggiornare il database, fai clic su Sì.

Per assicurarsi che il modello tenga in memoria le entità che sono in memoria con ciò che sta facendo il database, è necessario impostare le regole corrispondenti nel modello dati. Apri SchoolModel.edmx, fai clic con il pulsante destro del mouse sulla linea di associazione tra "blah" e "xyz", quindi seleziona Proprietà.

Nella finestra Proprietà, espandere INSERT e UPDATE Specifiche e impostare la DeleteRule proprietà Cascade.

Solution and images taken from http://www.asp.net/web-forms/tutorials/getting-started-with-ef/the-entity-framework-and-aspnet-getting-started-part-2

+0

Questa soluzione sembra funzionare per EF 4.1. Il DB ha già impostato. –

-1

l'ho trovato ...

andare a SQL Server

fare il suo database diagrammed

Fare clic destro sulla linea di nave di relazione tra genitori e figli e aprire la proprietà di esso.

Imposta INSERT e specifica aggiornamento e imposta semplicemente DELETE RULE TO CASCADE.

Ricordare Nessun progetto è richiesto nel Progetto PER QUESTO SCOPO e semplicemente eseguire il debug e divertirsi.

Problemi correlati