2017-02-15 20 views
0

У меня есть эта сущность:Изменить Составной первичный ключ для одного поля первичного ключа с кодом первой миграцией

public class GWDetail: Entity 
{ 
    public int? GWNR { get; set; } 
    public double? PRNR { get; set; } 
    public double? GWO { get; set; } 
    public double? GWU { get; set; } 

} 

переведенной с композитным PK

 // Primary Key 
     HasKey(t => new { t.PRNR, t.GWNR }); 

и хочет изменить его на:

public class GWDetail: Entity 
{ 
    public int? GWNR { get; set; } 
    public int? PRNR { get; set; } // change from double to int !! 
    public double? GWO { get; set; } 
    public double? GWU { get; set; } 

} 

и

  // Primary Key 
     HasKey(t => t.Id) 

Я создал сценарий надстройку миграции и прикладных ДОПОЛНЕНО базу данных, но получить:

Номер ошибки: 5074, Состояние: 1, Класс: 16 Объект «PK_dbo.GWDetail» зависит от столбца «PRNR ». ALTER TABLE ALTER COLUMN PRNR не удалось, так как один или несколько объектов попадают в этот столбец.

У GWDetail еще нет записей. Но есть родительская таблица, которая имеет отношение 1: n через GWNR к ней. В родительской таблице есть записи.

Может кто-нибудь помочь мне с этим? Спасибо, привет, Manu

ответ

0

Я сам это обработал, изменив последовательность действий в скрипте миграции.

Это сценарий, созданный EF:

 public override void Up() 
    { 
     AddColumn("dbo.GWDetails", "Id", c => c.Int(nullable: false, identity: true)); 
     AlterColumn("dbo.GWDetails", "PRNR", c => c.Int(nullable: false)); 
     AlterColumn("dbo.GWDetails", "GWNR1", c => c.Int()); 
     DropPrimaryKey("dbo.GWDetails", new[] { "PRNR", "GWNR1" }); 
     AddPrimaryKey("dbo.GWDetails", "Id"); 
    } 

А вот сценарий, который я использовал, чтобы обновить-базы данных:

 public override void Up() 
    { 
     DropPrimaryKey("dbo.GWDetails", new[] { "PRNR", "GWNR1" }); 
     AlterColumn("dbo.GWDetails", "PRNR", c => c.Int(nullable: false)); 
     AlterColumn("dbo.GWDetails", "GWNR1", c => c.Int()); 
     AddColumn("dbo.GWDetails", "Id", c => c.Int(nullable: false, identity: true)); 
     AddPrimaryKey("dbo.GWDetails", "Id"); 
    } 

Критическое действие было:

DropPrimaryKey("dbo.GWDetails", new[] { "PRNR", "GWNR1" }); 

который я должен был разместить в первой строке сценария. Я не понимаю, почему EF попытается создать новый ключ, пока старый все еще присутствует. С уважением, Ману