6

rozpoczął nową aplikację ASP.NET MVC 3 i otrzymuję następujący błąd:Jak usunąć rekord za pomocą ograniczenia klucza obcego?

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

Jak rozwiązać ten problem?

modele (code-first 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; } 
} 

Ustaw.regulatora

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

W bazie danych można wybrać opcję kaskadowego usuwania dla tabeli nadrzędnej? – Pankaj

+0

Twoja odpowiedź może już być [tutaj] (http://stackoverflow.com/a/5522422/60761). Jeśli nie, opublikuj kod DbSetup. Możesz usunąć widok. –

+0

@PankajGarg - zweryfikowałem, że baza danych ma już ten zestaw. –

Odpowiedz

15

Znaleziono rozwiązanie:

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

o super, odpowiedziałaś sama :) –

+0

+1 punkt za to –

+0

@ 白 ジ ェ ー ム ス Czy naprawdę masz "13" lat? –

7

Jeśli usuniesz rec ord ze stołu (powiedzmy "bla"), który ma inne relacje z innymi tabelami (xyz, abc). Domyślnie baza danych uniemożliwia usunięcie wiersza z "blah", jeśli istnieją powiązane wiersze w jednej z pozostałych tabel.
Rozwiązanie nr 1:
Najpierw można ręcznie usunąć powiązane wiersze, może to wymagać wiele pracy.
Rozwiązanie # 2:
Prostym rozwiązaniem jest skonfigurowanie bazy danych tak, aby usuwała je automatycznie po usunięciu wiersza "bla".

Śledź ten otwarty diagram bazy danych, a następnie kliknij na właściwości w relacji

enter image description here

W oknie właściwości rozwiń INSERT i UPDATE Specyfikacja i ustawić deleteRule własność Cascade.
enter image description here

Zapisz i zamknij diagram. Jeśli pojawi się pytanie, czy chcesz zaktualizować bazę danych, kliknij przycisk Tak.

Aby upewnić się, że model zachowuje jednostki w pamięci zsynchronizowane z bazą danych, należy ustawić odpowiednie reguły w modelu danych. Otwórz SchoolModel.edmx, kliknij prawym przyciskiem myszy linię powiązania między "bla" i "xyz", a następnie wybierz Właściwości.

W oknie właściwości rozwiń INSERT i UPDATE Specyfikacja i ustawić deleteRule właściwość 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

To rozwiązanie działa w przypadku wcześniejszych wersji EF 4.1. Baza danych już ją ustawiła. –

-1

znalazłem ...

Idź do SQL Server

aby jego bazy diagramu

prawym przyciskiem myszy na linii statku relacji między rodzicem a dzieckiem i otwórz własność niego.

Zestaw INSERT I Update Specification i po prostu ustaw REGUŁĘ DELEGOWANIA DO KASKU.

Pamiętaj W projekcie DLA CELU nie jest potrzebny żaden kod i po prostu debuguj i ciesz się nim

Powiązane problemy