1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Warum funktioniert Cascade Delete nicht?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Telefisch, 4 März 2019.

  1. Telefisch

    Telefisch Neuer Benutzer

    Hallo Forum,
    ich bin grade dabei eine ASP.Net MVC-App zu basteln.
    Hier arbeite ich mit Entity Framework6, was den SQL-Statements außer der Schreibweise aber egal sein dürfte.
    Beim Ändern einer Tabelle habe ich Schwierigkeiten und weiß nicht wie ich den Fehler am besten finden soll.

    Es gibt eine Tabelle Timesheet, die Zeitkarteneinträge halten soll.
    Diese Tabelle hatte zwei Verknüpfungen (n:1) zu anderen Tabellen und soll nun noch eine dritte bekommen.
    bei den ersten beiden Verknüpfungen gibt es einen ForeignKey mit Cascade delete True.
    Jetzt will ich die dritte Tabelle anknoten, bekomme aber den Fehler:

    "Introducing FOREIGN KEY constraint 'FK_dbo.Timesheets_dbo.Employees_EmployeeId' on table 'Timesheets' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints."

    In der Employees Tabelle gibt es nichts, was mit dieser Tabelle bereits in Verbindung steht.
    Warum funktioniert ausgerechnet diese Verknüpfung nicht, bzw. wonach kann ich suchen?
    Sicher könnte ich cascade delete auf false setzen, was hier auch kein Problem wäre da niemals ein Mitarbeiter gelöscht wird aber ich will das Problem verstehen.
     
    Zuletzt bearbeitet: 4 März 2019
  2. castorp

    castorp Datenbank-Guru

    Grundsätzlich kann SQL Server kein "CASCADE" bei Foreign keys die wiederum dieselbe Tabelle referenzieren.

    Kann es sein, dass die Tabelle Timesheets die Tabelle Employees referenziert und Employees dann wieder Timesheets?

    Kannst Du bitte mal die kompletten CREATE TABLE Statements, sowie die primary keys als auch die Foreign keys zeigen? (bitte mit [code]...[/code] tags formatieren)
     
  3. Telefisch

    Telefisch Neuer Benutzer

    Dass die Tabelle Employees die Tabelle Timesheets referenziert sehe ich nicht.
    Hier mal die CreateTable aus den Migrations:

    Employees:
    Code:
                CreateTable(
                    "dbo.Employees",
                    c => new
                        {
                            Id = c.Int(nullable: false, identity: true),
                            UserName = c.String(nullable: false, maxLength: 100),
                            PersonalId = c.String(maxLength: 10),
                            FirstName = c.String(nullable: false, maxLength: 50),
                            FamilyName = c.String(nullable: false, maxLength: 50),
                            Street = c.String(nullable: false, maxLength: 50),
                            PostCode = c.String(nullable: false, maxLength: 10),
                            City = c.String(nullable: false, maxLength: 50),
                            CountryId = c.Int(nullable: false),
                            Nationality = c.String(nullable: false, maxLength: 50),
                            PrivatePhone = c.String(maxLength: 30),
                            PrivateMobile = c.String(maxLength: 30),
                            BusinessMobile = c.String(maxLength: 30),
                            PrivateMail = c.String(maxLength: 50),
                            BusinessMail = c.String(maxLength: 50),
                            SocialEnsurance = c.String(maxLength: 50),
                            SocialEnsuranceId = c.String(maxLength: 50),
                            HealthEnsurance = c.String(maxLength: 50),
                            HealthEnsuranceId = c.String(maxLength: 30),
                            ReligionId = c.Int(nullable: false),
                            TeenagedChildren = c.Decimal(nullable: false, precision: 18, scale: 2),
                            Notes = c.String(),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.Countries", t => t.CountryId, cascadeDelete: true)
                    .ForeignKey("dbo.Religions", t => t.ReligionId, cascadeDelete: true)
                    .Index(t => t.CountryId)
                    .Index(t => t.ReligionId);
    
    Die Tabelle Timesheets
    Code:
    CreateTable(
                    "dbo.Timesheets",
                    c => new
                        {
                            Id = c.Int(nullable: false, identity: true),
                            ProjectId = c.Int(nullable: false),
                            TS_Date = c.DateTime(nullable: false, storeType: "date"),
                            Created = c.String(),
                            LastChange = c.String(),
                            byUser = c.String(),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.Projects", t => t.ProjectId, cascadeDelete: true)
                    .Index(t => t.ProjectId);
    
    dann wurde Timesheets noch erweitert:
    Code:
    [/COLOR][/FONT][/LEFT]
                AddColumn("dbo.Timesheets", "TS_Start", c => c.Time(nullable: false, precision: 7));
                AddColumn("dbo.Timesheets", "TS_Stop", c => c.Time(nullable: false, precision: 7));
                AddColumn("dbo.Timesheets", "TS_WorkBreak", c => c.Decimal(nullable: false, precision: 18, scale: 2));
                AddColumn("dbo.Timesheets", "OverTimeRequested", c => c.Boolean(nullable: false));
                AddColumn("dbo.Timesheets", "DriveToCustomer", c => c.Decimal(nullable: false, precision: 18, scale: 2));
                AddColumn("dbo.Timesheets", "DriveFromCustomer", c => c.Decimal(nullable: false, precision: 18, scale: 2));
                AddColumn("dbo.Timesheets", "ActivityId", c => c.Int(nullable: false));
                AddColumn("dbo.Timesheets", "Description", c => c.String(maxLength: 100));
                CreateIndex("dbo.Timesheets", "ActivityId");
                AddForeignKey("dbo.Timesheets", "ActivityId", "dbo.Activities", "Id", cascadeDelete: true);
    
    zuletzt wollte ich den FK zu Employees hinzufügen:
    Code:
                AddColumn("dbo.Timesheets", "EmployeeId", c => c.Int(nullable: false));
                CreateIndex("dbo.Timesheets", "EmployeeId");
                AddForeignKey("dbo.Timesheets", "EmployeeId", "dbo.Employees", "Id", cascadeDelete: true);
    
    HTH
    Carsten
     
  4. Telefisch

    Telefisch Neuer Benutzer

    Zur weiteren Erklärung, die Tabellen Activities, Countries und Religions referenzieren nichts weiter.
    Projects referenziert auf Customers, die wiederum auf Countries referenziert.

    Gibt es im VS2017 eine Ansicht, wo man alle Beziehungen sehen kann?
    Bin durch das Codefirst leider grade etwas ratlos bei den Database First-Möglichkeiten.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden