2016-12-21 7 views
0

Ich habe zwei Tabellen Mitarbeiter und Abschluss. Zwischen diesen beiden Tabellen gibt es eine Eins-zu-Viele-Beziehung. (Ein Mitarbeiter kann mehrere Abschlüsse haben.) Wenn ich einen Mitarbeiter lösche, möchte ich auch alle Ebenen dieses Mitarbeiters löschen. Ich habe in einem anderen Beitrag gefunden, dass ich cascade delete dafür verwenden kann. Ich habe versucht, Kaskadenlöschung hinzuzufügen, aber beim Versuch, einen Mitarbeiter zu löschen, erhalte ich einen Fehler. Ich habe versucht, die folgenden:So aktivieren Sie kaskadieren löschen

Meine beiden Tabellen:

public partial class Degree 
{ 
    public int DegreeId { get; set; } 
    public string Course { get; set; } 
    public string Level { get; set; } 
    public string School { get; set; } 
    public int Employee_BSN { get; set; } 

    public virtual Employee Employee { get; set; } 
} 

public partial class Employee 
{ 
    public Employee() 
    { 
     this.Degrees = new HashSet<Degree>(); 
    } 

    public int BSN { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; }  
    public virtual ICollection<Degree> Degrees { get; set; } 
} 

Nach ein paar Beiträge zu lesen ich diese gefunden. Aber das hat mein Problem nicht gelöst.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Degree>() 
      .HasRequired(t=>t.Employee) 
      .WithMany(t=>t.Degrees) 
      .HasForeignKey(d=>d.Employee_BSN) 
      .WillCascadeOnDelete(true); 
     base.OnModelCreating(modelBuilder); 
    } 

In meinem Mitarbeiter Controller habe ich folgende Löschmethode

// GET: Employees/Delete/5 
    public ActionResult Delete(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Employee employee = db.Employees.Find(id); 
     if (employee == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(employee); 
    } 

    // POST: Employees/Delete/5 
    [HttpPost, ActionName("Delete")] 
    [ValidateAntiForgeryToken] 
    public ActionResult DeleteConfirmed(int id) 
    { 
     Employee employee = db.Employees.Find(id); 
     db.Employees.Remove(employee); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

Fehler

Die DELETE-Anweisung in Konflikt mit der REFERENCE-Einschränkung "FK_Degree_Employee". Der Konflikt ist in der Datenbank "\ APP_DATA \ DATABASE.MDF", Tabelle "dbo.Degree", Spalte "Employee_BSN" aufgetreten. Die Anweisung wurde beendet.

+1

'„ aber ich erhalte eine Fehlermeldung“'. Bitte fügen Sie den Fehler hinzu. – TyCobb

+0

Sorry, habe vergessen, den Fehler hinzuzufügen. –

+1

Wahrscheinlich haben Sie kaskadiertes Löschen in der Datenbank nicht konfiguriert. EF geht davon aus, dass es da ist. –

Antwort

1

Gert ist richtig, höchstwahrscheinlich haben Sie keine kaskadierende Löschung konfiguriert.

Das Problem besteht darin, dass Entity Framework beim Löschen eines Mitarbeiters versucht, den Fremdschlüssel des Angestellten für alle zugeordneten Grad auf Null zu setzen. Und das ist wahrscheinlich nicht von Ihrem Datenbank-Design erlaubt - der Mitarbeiter-Fremdschlüssel darf nicht null sein.

Daher müssen Sie die kaskadierende Löschung für den Mitarbeiter FK in Ihrer Abschlusstabelle aktivieren.

Hier ist eine gute Antwort, wie Sie das tun können: https://stackoverflow.com/a/35886878/4227836