2013-07-30 2 views
9

Ich hatte diese KlassenEF Migrationen: Die ALTE TABLE-Anweisung in Konflikt mit der FOREIGN KEY-Einschränkung

public class Bid : ... 
{ 
    ... 

    [Required] 
    public virtual TraderUser Trader { get; set; } 
} 

public class TraderUser : ... 
{ 
    ... 
} 

ich diese Klassen in der folgenden Art und Weise dann geändert und hinzugefügt, um eine neue Klasse

public class Bid : ... 
{ 
    ... 

    [Required] 
    public virtual TraderUser TraderUser { get; set; } 
} 

public class TraderUser : ... 
{ 
    ... 

    public int TraderCompanyId { get; set; } 

    [ForeignKey("TraderCompanyId")] 
    public virtual TraderCompany TraderCompany { get; set; } 
} 

public class TraderCompany : ... 
{ 
    ... 
} 

Als ich habe eine Update-Datenbank ich habe die folgenden Fehler

die ALTE TA Die BLE-Anweisung steht im Konflikt mit der FOREIGN KEY-Einschränkung "FK_dbo.Bid_dbo.TraderUser_TraderUser_Id". Der Konflikt ist aufgetreten in Datenbank "LeasePlan.Development", Tabelle "dbo.TraderUser", Spalte "Id".

Ich kann die Datenbank nicht aktualisieren. Jede Hilfe wird sehr geschätzt.

+0

Welche Beziehungen versuchen Sie zwischen diesen 3 Klassen zu erreichen? Und gibt es Eigenschaften in der Klasse "TraderCompany"? – SOfanatic

+0

Ein Gebot hat einen Händler und ein Händler hat eine Händlerfirma. TraderCompany hat nur einige String-Eigenschaften. –

Antwort

24

Ich weiß nicht, ob es zu spät ist, aber ich hatte dasselbe Problem und vielleicht könnte Ihnen das helfen.

Ich kann nicht von Ihrem Beitrag sehen, aber wahrscheinlich Ihre TraderUser-Tabelle hat einige Zeilen bereits eingefügt. Sie versuchen, eine neue Tabelle TraderCompany zu erstellen und eine Fremdschlüsselbeziehung in TraderUser zu erstellen, die auf die Tabelle TraderCompany verweist.

In einer Migration versuchen Sie eine Fremdschlüsselbeziehung ohne Nullwert für eine Tabelle zu erstellen, die bereits Daten enthält.

Sie könnten auf die versuchen, folgende:

  • Erste Migration - alles gleich, außer dieser Linie

    public int TraderCompanyId { get; set; } 
    

    sollte

    public int? TraderCompanyId { get; set; } 
    

    Dies ermöglicht es Ihnen auf NULL festlegbare zu erstellen Fremdschlüssel Spalte.

  • Aktualisieren Sie Ihre TraderCompanyId-Spalte für vorhandene Daten mit einer Zeile aus der TraderCompany-Tabelle.

  • Zweite Migration - Code ändern aus

    public int? TraderCompanyId { get; set; } 
    

    zu

    public int TraderCompanyId { get; set; } 
    

    und Migration führen.

Ich hoffe, das wird Ihnen helfen.

0

Die Alternative besteht darin, innerhalb des Migrationscodes eine SQL-Anweisung hinzuzufügen, um eine Zeile einzufügen, bevor die Fremdschlüssel hinzugefügt werden. Hier ist ein Beispiel von dem, was ich getan habe:

 // Countries is a new table 
     CreateTable(
      "dbo.Countries", 
      c => new 
       { 
        CountryID = c.Int(nullable: false, identity: true), 
        Name = c.String(), 
        Currency = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.CountryID); 
     // Heres where i insert a row into countries 
     Sql("INSERT INTO Countries (Name, Currency) VALUES ('United Kingdom', 0)"); 
     // I set the default value to 1 on the ID fields 
     AddColumn("dbo.Brokers", "CountryID", c => c.Int(nullable: false, defaultValue: 1)); 
     AddColumn("dbo.Products", "CountryID", c => c.Int(nullable: false, defaultValue: 1)); 
     AddForeignKey("dbo.Brokers", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false); 
     AddForeignKey("dbo.Products", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false); 
     // Migrations then creates index's 
     CreateIndex("dbo.Brokers", "CountryID"); 
     CreateIndex("dbo.Products", "CountryID"); 
Verwandte Themen