2016-09-01 5 views
1

J'essaie de cretae constrint entre deux tables en utilisant le code première attitude:Pourquoi ai-je une erreur sur la commande update-database?

est ici entités:

public class Client : IEntity 
{ 
    public int Id { get; set; } 
    public int IdentityNumber { get; set; } 
    public int? ClientTypeId { get; set; } 
    public string ClientName { get; set; } 
    public string Departament { get; set; } 
    public string Division { get; set; } 

    public virtual ICollection<Contact> Contacts { get; set; } 
    [ForeignKey("ClientTypeId")] 
    public virtual ClientType ClientType { get; set; } 
} 

Deuxième entité:

public class ClientType : ILookupEntity 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public string Comment { get; set; } 
} 

Voici créé la migration:

public override void Up() 
    { 
     CreateTable(
      "dbo.ClientTypes", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Description = c.String(), 
        Comment = c.String(), 
       }) 
      .PrimaryKey(t => t.Id); 

     CreateIndex("dbo.Clients", "ClientTypeId"); 
     AddForeignKey("dbo.Clients", "ClientTypeId", "dbo.ClientTypes", "Id"); 
    } 

    public override void Down() 
    { 
     DropForeignKey("dbo.Clients", "ClientTypeId", "dbo.ClientTypes"); 
     DropIndex("dbo.Clients", new[] { "ClientTypeId" }); 
     DropTable("dbo.ClientTypes"); 
    } 
} 

Mais sur la commande update-database j'obtiens ceci erreur:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Clients_dbo.ClientTypes_ClientTypeId". The conflict occurred in database "Playground", table "dbo.ClientTypes", column 'Id'. 

Tout ce qui peut causer l'erreur?

Répondre

3

Cela peut être dû au fait que vous avez déjà eu la colonne ClientTypeId (car lors de la migration, nous n'avons pas d'opération CreateColumn) et vous pouvez avoir des valeurs non nulles dans cette colonne. Et lorsque vous créez une nouvelle table (vide) ClientTypes et que vous définissez FK à cette table La table des clients n'a pas de principal (lignes parent) dans la nouvelle table créée juste, par conséquent - exception est levée. Donc, vous devez effacer la colonne ClientTypeId avant FK création, puis le remplir en fonction du contenu de la table ClientTypes:

public override void Up() 
{ 
    CreateTable(
     "dbo.ClientTypes", 
     c => new 
      { 
       Id = c.Int(nullable: false, identity: true), 
       Description = c.String(), 
       Comment = c.String(), 
      }) 
     .PrimaryKey(t => t.Id); 

    CreateIndex("dbo.Clients", "ClientTypeId"); 

    //Add this line 
    Sql("UPDATE dbo.Clients SET ClientTypeId = null")  
    AddForeignKey("dbo.Clients", "ClientTypeId", "dbo.ClientTypes", "Id"); 
}