2013-07-30 22 views
9

miałem tych klasEF Migracje: ALTER TABLE skonfliktowany z FOREIGN KEY przymusu

public class Bid : ... 
{ 
    ... 

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

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

Potem zmieniły tych klas w następujący sposób i dodaje nową klasę

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 : ... 
{ 
    ... 
} 

Kiedy zrobił update-bazy mam następujący błąd

ALTER TA Instrukcja BLE koliduje z ograniczeniem klucza OBCEGO "FK_dbo.Bid_dbo.TraderUser_TraderUser_Id". Konflikt wystąpił w bazie danych "LeasePlan.Development" , tabeli "dbo.TraderUser", kolumnie "Id".

Nie mogę pobrać bazy danych do aktualizacji. Każda pomoc jest doceniana.

+0

Jakie relacje między tymi 3 klasami chcesz osiągnąć? I czy istnieją jakieś właściwości w klasie "TraderCompany'? – SOfanatic

+0

Oferta ma użytkownika przedsiębiorcy, a użytkownik przedsiębiorcy ma firmę handlową. TraderCompany ma tylko kilka właściwości ciągu. –

Odpowiedz

24

Nie wiem, czy jest za późno, ale miałem ten sam problem i być może to mogłoby pomóc.

Nie widzę z Twojego posta, ale prawdopodobnie twoja tabela TraderUser zawiera już kilka wierszy. Próbujesz osiągnąć nową tabelę TraderCompany i utworzyć relację klucza obcego w TraderUser, która wskazuje na tabelę TraderCompany.

Podczas jednej migracji próbujesz utworzyć relację klucza obcy niepodlegającego zerowaniu dla tabeli zawierającej już dane.

Można spróbować następujących czynności:

  • Pierwsza migracja - wszystko to samo, z wyjątkiem tej linii

    public int TraderCompanyId { get; set; } 
    

    powinny być

    public int? TraderCompanyId { get; set; } 
    

    To pozwoli na tworzenie pustych kolumna klucza obcego.

  • Zaktualizuj kolumnę TraderCompanyId dla istniejących danych za pomocą wiersza z tabeli TraderCompany.

  • drugie migracja - Zmiana kodu z

    public int? TraderCompanyId { get; set; } 
    

    do

    public int TraderCompanyId { get; set; } 
    

    i uruchomić migrację.

Mam nadzieję, że to ci pomoże.

0

Alternatywą jest dodanie instrukcji SQL w kodzie migracji, aby wstawić wiersz przed dodaniem obcych kluczy. Oto przykład tego, co zrobiłem:

 // 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"); 
Powiązane problemy