2014-10-11 3 views
6

Когда я запускаю следующую миграцию, я получаю следующее сообщение об ошибке:Оператор TABLE ALTER противоречили с ограничением FOREIGN KEY

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint

У меня есть существующая база данных и рефакторинга модель включает свойство навигации.

Смотрите оригинальную модель, а затем новую модель:

Оригинальная модель:

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Country { get; set; } 
} 

Новая модель:

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int CountryID { get; set; } 
    public virtual Country Country { get; set; } 
} 

public class Country 
{ 
    public int ID { get; set; }    
    public string Country { get; set; } 
} 

Add-Migration навигации свойство:

public override void Up() 
{ 
      CreateTable(
       "dbo.Countries", 
       c => new 
        { 
         ID = c.Int(nullable: false, identity: true), 
         CountryName = c.String(), 
        }) 
       .PrimaryKey(t => t.ID); 

      AddColumn("dbo.Students", "CountryID", c => c.Int(nullable: false)); 
      CreateIndex("dbo.Students", "CountryID"); 
      AddForeignKey("dbo.Students", "CountryID", "dbo.Countries", "ID", cascadeDelete: true); 
      DropColumn("dbo.Students", "Country"); 
} 

Update-Database ошибка:

System.Data.SqlClient.SqlException (0x80131904): The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Students_dbo.Countries_CountryID". The conflict occurred in database "aspnet-navprop-20141009041805", table "dbo.Countries", column 'ID'.

+0

Почему этот вопрос проголосовали? Я думал, что вопрос хорошо документирован. –

ответ

3

У меня такая же проблема, у меня в таблице были данные, поэтому я изменил колонку внешнего ключа на значение NULL.

AddColumn("dbo.Students", "CountryID", c => c.Int(nullable: true)); 

Вы должны изменить ваш код, который затем снова запустите Update-Database -Verbose

public override void Up() 
{ 
      CreateTable(
       "dbo.Countries", 
       c => new 
        { 
         ID = c.Int(nullable: false, identity: true), 
         CountryName = c.String(), 
        }) 
       .PrimaryKey(t => t.ID); 

      AddColumn("dbo.Students", "CountryID", c => c.Int(nullable: true)); 
      CreateIndex("dbo.Students", "CountryID"); 
      AddForeignKey("dbo.Students", "CountryID", "dbo.Countries", "ID", cascadeDelete: true); 
      DropColumn("dbo.Students", "Country"); 
} 
3

У меня был таким же проблема и усеченная таблицу с внешним ключом записью и ей это удалось.

2

Если в таблице (таблице учеников) есть данные, удалите их, а затем повторите попытку.

0

против вашего студенческого лица вы можете пометить вашу собственность CountryId в Nullable, используя знак вопроса прилагаемого к типу, т.е.

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int? CountryID { get; set; } 
    public virtual Country Country { get; set; } 
}