2017-02-15 4 views
0

Ich habe diese Einheit:ändern Verbundprimärschlüssel Einfeldprimärschlüssel mit Code zuerst Migration

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

} 

mit einem Composite-PK abgebildet

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

und wollen es ändern:

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; } 

} 

und

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

Ich habe das Add-Migrationsscript und angewandt Update-Datenbank erstellt, aber erhalten:

Fehlernummer: 5074, Zustand: 1, Klasse: 16 Das Objekt 'PK_dbo.GWDetail' ist abhängig von der Spalte ‚PRNR ". ALTER TABLE ALTER COLUMN PRNR ist fehlgeschlagen, weil ein oder mehrere Objekte auf diese Spalte zugreifen.

GWDetail hat noch keine Datensätze. Aber es gibt eine Elterntabelle, die eine 1: n-Beziehung über GWNR hat. Die Elterntabelle enthält Datensätze.

Kann mir jemand dabei helfen? Danke und Grüße, Manu

Antwort

0

Ich habe es selbst durch Ändern der Reihenfolge der Aktionen im Migrationsskript ausgearbeitet.

Dies ist das Skript von EF erstellt:

 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"); 
    } 

Und hier das Skript, das ich ein Update-Datenbank verwendet:

 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"); 
    } 

Die kritische Aktion war:

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

was ich in die erste Zeile des Skripts platzieren musste. Ich verstehe nicht, warum EF versuchen würde, den neuen Schlüssel zu erstellen, während der alte noch vorhanden ist. Grüße, Manu

Verwandte Themen