Warum funktioniert Cascade Delete nicht?

Telefisch

Neuer Benutzer
Beiträge
3
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:
Werbung:
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)
 
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
 
Werbung:
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.
 
Zurück
Oben