6

Comienza una nueva aplicación ASP.NET MVC 3 y consiguiendo el error siguiente:¿Cómo eliminar un registro con una restricción de clave externa?

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

cómo solucionar esto?

Modelos (código primer 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; } 
} 

controlador de configuración

// 
// 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

En la base de datos, ¿puede elegir la opción de eliminar en cascada para su tabla principal? – Pankaj

+0

Su respuesta puede ser [aquí] (http://stackoverflow.com/a/5522422/60761) ya. Si no, publique el código DbSetup. Puedes eliminar la Vista. –

+0

@PankajGarg - Verifiqué que la base de datos ya tiene este conjunto. –

Respuesta

15

encontrado la solución:

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 genial, respondiste a ti mismo :) –

+0

+1 punto por eso –

+0

@ ス ジ "ス ス ス eres realmente" 13 "años de edad? –

7

Si se elimina un rec ord de una tabla (digamos "blah"), que tiene otras relaciones con otras tablas (xyz, abc). De forma predeterminada, la base de datos evitará que elimine una fila en "blah" si hay filas relacionadas en una de las otras tablas.
Solución n. ° 1:
Primero puede eliminar manualmente las filas relacionadas, esto puede requerir mucho trabajo.
Solución n. ° 2:
una solución fácil es configurar la base de datos para eliminarlos automáticamente cuando elimine una fila "bla".

Siga este abierta su diagrama de base de datos y haga clic en las propiedades de la relación

enter image description here

En la ventana Propiedades, expanda INSERT y ACTUALIZACIÓN especificación y establecer el DeleteRule propiedad a Cascade.
enter image description here

Guarde y cierre el diagrama. Si se le pregunta si desea actualizar la base de datos, haga clic en Sí.

Para asegurarse de que el modelo mantiene las entidades que están en la memoria sincronizadas con lo que está haciendo la base de datos, debe establecer las reglas correspondientes en el modelo de datos. Abra SchoolModel.edmx, haga clic con el botón derecho en la línea de asociación entre "blah" y "xyz", y luego seleccione Propiedades.

En la ventana Propiedades, expanda INSERT y ACTUALIZACIÓN especificación y establecer el DeleteRule propiedad a 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

Esta solución parece funcionar para pre EF 4.1. El DB lo tiene establecido ya. –

-1

me pareció ...

ir a SQL Server

hacen de su base de datos diagramado

Haga clic derecho en la línea nave de la relación entre padre e hijo y abrir la propiedad de la misma.

Configure INSERTAR y actualizar la especificación y simplemente configure DELETE RULE TO CASCADE.

Recuerde Ningún código se requiere en proyecto para este propósito y simplemente depuración y disfrutar de ella.

Cuestiones relacionadas