it-swarm.com.de

Entity Framework Die Anweisung ALTER TABLE steht in Konflikt mit der FOREIGN KEY-Einschränkung

Beim Aktualisieren der Datenbank in Entity Framework, Code first Migration, wird diese Fehlermeldung angezeigt:

Die Anweisung ALTER TABLE steht im Konflikt mit der FOREIGN KEY-Einschränkung "FK_dbo.Clients_dbo.MedicalGroups_MedicalGroupId". Der Konflikt ist in der Datenbank "hrbc" in der Tabelle "dbo.MedicalGroups" in der Spalte "Id" aufgetreten.

Das ist meine Klasse:

public partial class Client
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int? MedicalGroupId { get; set; }
    [ForeignKey("MedicalGroupId")]
    public virtual MedicalGroups MedicalGroup { get { return _MedicalGroup; } set { _MedicalGroup = value; } }
}

Hier ist meine 2. Klasse:

public partial class MedicalGroups
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
}

Und dies ist meine Migration, die ich anwenden möchte:

public override void Up()
{
    AddForeignKey("dbo.Clients", "MedicalGroupId", "dbo.MedicalGroups", "Id");
    CreateIndex("dbo.Clients", "MedicalGroupId");
}
48
Zaid Iqbal

Ich habe die Lösung meines Problems bekommen. Problem sind "Daten", die ich in meiner Kundentabelle habe. Da meine Client-Tabelle Werte für medicalgroupid enthält, die nicht wirklich vorhanden sind, gibt es daher einen Fehler bei der Fremdschlüsseleinschränkung.

Update Client set MedicalGroupId = NULL
2
Zaid Iqbal

Vergewissern Sie sich, dass in der Datenbank keine Daten vorhanden sind, die mit der FK-Einschränkung in Konflikt stehen, wodurch die Erstellung fehlschlägt.

90
Turnkey

Ich denke, @Cory hat Sie an die richtige Lösung herangeführt, Sie haben sich einfach nicht die Zeit genommen, um nachzuforschen.

In add-migration code wurde die Migration wahrscheinlich generiert

public override void Up()
{
AddColumn("dbo.ClientContacts", "FamilialRelationshipId", c => c.Int(nullable: false));
CreateIndex("dbo.ClientContacts", "FamilialRelationshipId");
AddForeignKey("dbo.ClientContacts", "FamilialRelationshipId", "dbo.FamilialRelationships",        "FamilialRelationshipId");
}

Beachten Sie nullable: false; Wenn Ihr Modell eine ID von int anstelle von int hatte? (nullable int) Der Migrationscode setzt den Wert null auf false . Ihr Modell zeigt an, dass Sie ein nicht nullfähiges int verwenden, das standardmäßig 0 ist, und Sie haben wahrscheinlich kein Fremdschlüsselelement mit dem Wert 0. 

Jetzt müssen Sie entweder einen Standardwert erstellen, der in der Fremdschlüsseltabelle, Vorhanden ist, oder die Bedingung erstellen, ohne zu prüfen, ob Sie SQL Server zum Erstellen der Einschränkung verwenden. Beachten Sie jedoch Folgendes: Wenn Sie Ihre Eigenschaft mit einem Attribut [DefaultValue (0)] dekorieren, werden die vorhandenen Daten nicht geändert, wie dies bei einer SQL-Spalte Hinzufügen der Fall wäre, wenn ein Standardwert angegeben wurde.

Ich empfehle Ihnen, Ihre Modellklasse zu ändern, um ein mit Null belegbares int zuzulassen. Erstellen Sie anschließend in Ihrer Seed-Methode eine einfache Methode für dbcontext, um die neue Spalte mit einem Standardwert zu aktualisieren, da das Attribut [DefaultValue] in Datenanmerkungen Ihre Daten nicht ändert.

Add-Migration/Update-Database zum Erstellen der Spalte und der Einschränkung ..__ Ändern Sie als Nächstes Ihr Modell, wenn Sie ein nicht-nullfähiges int zulassen möchten, und nehmen Sie an, dass Sie alle Zeilen in einen gültigen Wert für den Fremdschlüssel, Add, geändert haben -Migrations-/Update-Datenbank erneut ... Dies gibt Ihnen eine ununterbrochene Kette in Ihrer Modellmigration. Wird später nützlich sein, wenn Sie auf einer Live-Site veröffentlichen, da der Fluss Ihrer Datenmodelländerungen intakt ist.

  • Hoffe das hilft.
25
RickIsWright

Dieser Fehler weist Sie darauf hin, dass Sie gegen die Fremdschlüsseleinschränkung verstoßen. Zur Lösung haben Sie einige Lösungen

  1. Fixiere deine Daten - Irgendwo gibt es Datensätze in der Clients-Tabelle, die eine MedicalGroupId haben, die in der in der MedicalGroups-Tabelle nicht vorhanden ist. Schreiben Sie eine Abfrage, um herauszufinden, welche IDs in der MedicalGroups-Tabelle nicht vorhanden sind
  2. Entfernen der Fremdschlüsseleinschränkung - Wenn Sie die Fremdschlüsseleinschränkung entfernen, werden Sie offensichtlich nicht mehr durch diese Nachricht gestört. Leider erzwingt die Datenbank diese Beziehung nicht mehr und kann dieses Problem in Zukunft noch verschlimmern.
  3. Constraint mit WITH NOCHECK erstellen - Sie können Ihre Fremdschlüssel-Constraint mit der WITH NOCHECK-Option erstellen. Diese Option weist SQL Server an, diese Einschränkung nicht auf vorhandene Daten anzuwenden. SQL Server prüft diese Einschränkung in zukünftigen INSERTS/UPDATES/DELETES.
11
Cory

dieses Problem tritt auf, weil Ihre Tabelle nicht leer ist . Sie sollten also das neue Feld hinzufügen, ohne es wie einen Fremdschlüssel anhängen zu müssen . public int? MedicalGroupId {get; einstellen; } . Führen Sie den Befehl update-database in der Paketverwaltungskonsole aus. Füllen Sie dann das Feld in dieser Tabelle (Client) mit den richtigen Daten (Wert ist in MedicalGroupsId vorhanden) . Fügen Sie die Zeile ein, um den Fremdschlüssel zu erstellen [ForeignKey ("MedicalGroupId")]. . öffentliche virtuelle MedicalGroups MedicalGroup {get {return _MedicalGroup; } set {_MedicalGroup = Wert; }} . Zum Abschluss führen Sie den Befehl update-database aus. Es wird in Ordnung sein.

6
chekib

Für andere, die hier landen könnten, könnte es eine sehr einfache Lösung geben, wenn Sie Code-First Entity Framework verwenden und einfach versuchen, einer Tabelle mit vorhandenen Daten eine neue erforderliche Spalte hinzuzufügen. 

Hinweis: Bevor Sie dies tun, müssen Sie nur wissen, dass Sie dieser neuen Spalte einen gültigen Wert für alle vorhandenen Zeilen hinzufügen müssen. Überlegen Sie, welchen Wert Sie den vorhandenen Zeilen hinzufügen, bevor Sie fortfahren. Möglicherweise möchten Sie einen Wert angeben, der der erforderlichen Nachschlagetabelle "Ungültig" oder "Unbekannt" angibt. 

Setzen Sie die Spalte in Ihrem Modell auf null, indem Sie das Feld? nach dem int. Speichern und kompilieren Sie das Modell. Führen Sie die Update-Datenbank aus.

Beispiel:

[ForeignKey("Title")]
public int? TitleId { get; set; }

Aktualisieren Sie in der Datenbank die Tabelle, indem Sie die NULL-Werte durch einen gültigen Lookup-Wert ersetzen. In meinem Fall habe ich meiner Titel-Lookup-Tabelle "Unbekannt" hinzugefügt und dann alle Zeilen in der Masse bearbeitet, um auf diese Lookup-ID zu verweisen.

Zurück in Ihrem Modell, entfernen Sie das '?' Die Spalte kann also nicht mehr nullgestellt werden. Speichern und kompilieren Sie das Modell und führen Sie dann Update-Database aus

Du solltest jetzt gut sein.

2
GrayDwarf

Ich hatte dieses Problem auch mit defaultValue gesetzt, gab:

Msgstr "Das Objekt ist von der Spalte ALTER TABLE ALTER COLUMN abhängig, da ein oder mehrere Objekte auf diese Spalte zugreifen." 

Beenden Sie den Befehl AddForeignKey/DropForeignKey zu einer neuen Migration und führen Sie sie in separaten Aktualisierungsdatenbankbefehlen aus. 

    public override void Up()
    {
        CreateTable(
            "dbo.DecisionAccesses",
            c => new
            {
                Id = c.Int(nullable: false),
                Name = c.String(nullable: false, maxLength: 50),
            })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.DecisionPersonStatus",
            c => new
            {
                Id = c.Int(nullable: false),
                Name = c.String(nullable: false, maxLength: 50),
            })
            .PrimaryKey(t => t.Id);

        AddColumn("dbo.DecisionForm_DecisionFields", "DecisionAccessId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
        AddColumn("dbo.DecisionMatterPersons", "DecisionPersonStatusId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
        CreateIndex("dbo.DecisionForm_DecisionFields", "DecisionAccessId");
        CreateIndex("dbo.DecisionMatterPersons", "DecisionPersonStatusId");
        //I moved outcommented to next migration and ran the migrations in separate steps to avoid: (The object is dependent on column ALTER TABLE ALTER COLUMN failed because one or more objects access this column)
        //AddForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses", "Id", cascadeDelete: true); 
        //AddForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus", "Id", cascadeDelete: true);
    }


    public override void Down()
    {
        //Moved to next migration
        //DropForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus");
        //DropForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses");
    }
2
Sgedda

Angenommen, die Migrationen sind in der richtigen Reihenfolge, d. H. Die mit dem Fremdschlüssel verknüpfte Tabelle wird vor der Referenz erstellt. Folgen Sie den folgenden Schritten: 

  1. Sichern der aktuellen Datenbank aus dem SQL Management Studio (falls erforderlich)
  2. Datenbank aus dem SQL Management Studio löschen 
  3. Geben Sie "Update-Database" in Visual Studio "Package Manager Console" ein.
1
Kuldeep Padhiar

Dieser Fehler kann auch auftreten, wenn die untergeordnete Tabelle verwaiste Datensätze enthält. Bereinigen Sie die Datenbank, um das Problem zu beheben.

Führen Sie den Befehl Add-Migration InitialCreate –IgnoreChanges in der Package Manager Console aus. Dadurch wird eine leere Migration mit dem aktuellen Modell als Momentaufnahme erstellt.

Führen Sie den Befehl Update-Database in der Package Manager Console aus. Dadurch wird die InitialCreate-Migration auf die Datenbank angewendet. Da die eigentliche Migration keine Änderungen enthält, wird der Tabelle __MigrationsHistory einfach eine Zeile hinzugefügt, die darauf hinweist, dass diese Migration bereits angewendet wurde.

Weitere Informationen erhalten Sie hier: https://msdn.Microsoft.com/en-us/library/dn579398(v=vs.113).aspx

0
Ersin

Ich habe auch diese Nachricht erhalten. Das Problem war, dass die Testdaten in der Datenbank falsch waren. Ich hatte keine Validierung beim Testen und daher hatte ich Nullwerte für IDs für Felder, die keine Nullen zulassen. Nachdem ich die Daten repariert hatte, wurde der Befehl update-database erfolgreich ausgeführt.

0
Fabian Madurai